Skip to content

Commit 3516dd4

Browse files
feat: add universal IDs to client nodes
1 parent 3459122 commit 3516dd4

File tree

16 files changed

+89
-136
lines changed

16 files changed

+89
-136
lines changed

packages/kit/src/core/config/index.spec.js

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ const get_defaults = (prefix = '') => ({
101101
serviceWorker: {
102102
register: true
103103
},
104-
tracing: false,
104+
tracing: undefined,
105105
typescript: {},
106106
paths: {
107107
base: '',
@@ -383,58 +383,59 @@ test('errors on loading config with incorrect default export', async () => {
383383
});
384384

385385
test('accepts valid tracing values', () => {
386-
// Test boolean values
387386
assert.doesNotThrow(() => {
388387
validate_config({
389388
kit: {
390-
tracing: true
389+
tracing: 'server'
391390
}
392391
});
393392
});
394393

395394
assert.doesNotThrow(() => {
396395
validate_config({
397396
kit: {
398-
tracing: false
397+
tracing: undefined
399398
}
400399
});
401400
});
401+
});
402402

403-
// Test string values
404-
assert.doesNotThrow(() => {
403+
test('errors on invalid tracing values', () => {
404+
assert.throws(() => {
405405
validate_config({
406406
kit: {
407-
tracing: 'server'
407+
// @ts-expect-error - given value expected to throw
408+
tracing: true
408409
}
409410
});
410-
});
411+
}, /^config\.kit\.tracing should be undefined or "server"$/);
411412

412-
assert.doesNotThrow(() => {
413+
assert.throws(() => {
413414
validate_config({
414415
kit: {
415-
tracing: 'client'
416+
// @ts-expect-error - given value expected to throw
417+
tracing: false
416418
}
417419
});
418-
});
420+
}, /^config\.kit\.tracing should be undefined or "server"$/);
419421

420-
assert.doesNotThrow(() => {
422+
assert.throws(() => {
421423
validate_config({
422424
kit: {
423-
tracing: undefined
425+
// @ts-expect-error - given value expected to throw
426+
tracing: 'client'
424427
}
425428
});
426-
});
427-
});
429+
}, /^config\.kit\.tracing should be undefined or "server"$/);
428430

429-
test('errors on invalid tracing values', () => {
430431
assert.throws(() => {
431432
validate_config({
432433
kit: {
433434
// @ts-expect-error - given value expected to throw
434435
tracing: 'invalid'
435436
}
436437
});
437-
}, /^config\.kit\.tracing should be true, false, "server", or "client"$/);
438+
}, /^config\.kit\.tracing should be undefined or "server"$/);
438439

439440
assert.throws(() => {
440441
validate_config({
@@ -443,7 +444,7 @@ test('errors on invalid tracing values', () => {
443444
tracing: 42
444445
}
445446
});
446-
}, /^config\.kit\.tracing should be true, false, "server", or "client"$/);
447+
}, /^config\.kit\.tracing should be undefined or "server"$/);
447448

448449
assert.throws(() => {
449450
validate_config({
@@ -452,5 +453,5 @@ test('errors on invalid tracing values', () => {
452453
tracing: null
453454
}
454455
});
455-
}, /^config\.kit\.tracing should be true, false, "server", or "client"$/);
456+
}, /^config\.kit\.tracing should be undefined or "server"$/);
456457
});

packages/kit/src/core/config/options.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,10 +270,11 @@ const options = object(
270270
files: fun((filename) => !/\.DS_Store/.test(filename))
271271
}),
272272

273-
tracing: validate(false, (input, keypath) => {
274-
if (typeof input === 'boolean') return input;
275-
if (input === 'server' || input === 'client') return input;
276-
throw new Error(`${keypath} should be true, false, "server", or "client"`);
273+
tracing: validate(undefined, (input, keypath) => {
274+
if (input !== 'server') {
275+
throw new Error(`${keypath} should be undefined or "server"`);
276+
}
277+
return input;
277278
}),
278279

279280
typescript: object({

packages/kit/src/core/sync/write_client_manifest.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,6 @@ export function write_client_manifest(kit, manifest_data, output, metadata) {
174174
175175
export const hash = ${s(kit.router.type === 'hash')};
176176
177-
export const tracing = ${s(kit.tracing === true || kit.tracing === 'client')};
178-
179177
export const decode = (type, value) => decoders[type](value);
180178
181179
export { default as root } from '../root.${isSvelte5Plus() ? 'js' : 'svelte'}';

packages/kit/src/core/sync/write_server.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import { set_building, set_prerendering } from '__sveltekit/environment';
3333
import { set_assets } from '__sveltekit/paths';
3434
import { set_manifest, set_read_implementation } from '__sveltekit/server';
3535
import { set_private_env, set_public_env, set_safe_public_env } from '${runtime_directory}/shared-server.js';
36+
import { get_tracer } from '${runtime_directory}/telemetry/get_tracer.js';
3637
3738
export const options = {
3839
app_template_contains_nonce: ${template.includes('%sveltekit.nonce%')},
@@ -60,7 +61,7 @@ export const options = {
6061
.replace(/%sveltekit\.status%/g, '" + status + "')
6162
.replace(/%sveltekit\.error\.message%/g, '" + message + "')}
6263
},
63-
tracing: ${config.kit.tracing === true || config.kit.tracing === 'server'},
64+
tracer: get_tracer({ is_enabled: ${s(config.kit.tracing === 'server')} }),
6465
version_hash: ${s(hash(config.kit.version.name))}
6566
};
6667

packages/kit/src/exports/public.d.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -695,15 +695,11 @@ export interface KitConfig {
695695
files?(filepath: string): boolean;
696696
};
697697
/**
698-
* Whether to enable OpenTelemetry tracing for SvelteKit operations including handle hooks, load functions, and form actions.
699-
* - `true` - Enable tracing for both server and client
700-
* - `false` - Disable tracing
701-
* - `'server'` - Enable tracing only on the server side
702-
* - `'client'` - Enable tracing only on the client side
703-
* @default false
698+
* Whether to enable serverside OpenTelemetry tracing for SvelteKit operations including handle hooks, load functions, and form actions.
699+
* @default undefined
704700
* @since 2.22.0
705701
*/
706-
tracing?: boolean | 'server' | 'client';
702+
tracing?: 'server';
707703
typescript?: {
708704
/**
709705
* A function that allows you to edit the generated `tsconfig.json`. You can mutate the config (recommended) or return a new one.

packages/kit/src/runtime/client/client.js

Lines changed: 9 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,16 @@ import {
3636
import { validate_page_exports } from '../../utils/exports.js';
3737
import { compact } from '../../utils/array.js';
3838
import { HttpError, Redirect, SvelteKitError } from '../control.js';
39-
import { INVALIDATED_PARAM, TRAILING_SLASH_PARAM, validate_depends } from '../shared.js';
39+
import {
40+
INVALIDATED_PARAM,
41+
TRAILING_SLASH_PARAM,
42+
validate_depends,
43+
validate_load_response
44+
} from '../shared.js';
4045
import { get_message, get_status } from '../../utils/error.js';
4146
import { writable } from 'svelte/store';
4247
import { page, update, navigating } from './state.svelte.js';
4348
import { add_data_suffix, add_resolution_suffix } from '../pathname.js';
44-
import { record_span } from '../telemetry/record_span.js';
45-
import { get_tracer } from '../telemetry/get_tracer.js';
4649

4750
export { load_css };
4851

@@ -755,45 +758,16 @@ async function load_node({ loader, parent, url, params, route, server_data_node
755758
}
756759
};
757760

758-
async function traced_load() {
759-
const tracer = await get_tracer({ is_enabled: app.tracing });
760-
761-
return record_span({
762-
name: 'sveltekit.load.universal',
763-
tracer,
764-
attributes: {
765-
'sveltekit.load.node_id': node.universal_id || 'unknown',
766-
'sveltekit.load.type': 'universal',
767-
'sveltekit.load.environment': 'client',
768-
'sveltekit.route.id': route.id || 'unknown'
769-
},
770-
fn: async () => (await node.universal?.load?.call(null, load_input)) ?? null
771-
});
772-
}
773-
774761
if (DEV) {
775762
try {
776763
lock_fetch();
777-
data = await traced_load();
778-
779-
if (data != null && Object.getPrototypeOf(data) !== Object.prototype) {
780-
throw new Error(
781-
`the load function located in ${node.universal_id} returned ${
782-
typeof data !== 'object'
783-
? `a ${typeof data}`
784-
: data instanceof Response
785-
? 'a Response object'
786-
: Array.isArray(data)
787-
? 'an array'
788-
: 'a non-plain object'
789-
}, but must return a plain object at the top level (i.e. \`return {...}\`)`
790-
);
791-
}
764+
data = (await node.universal.load.call(null, load_input)) ?? null;
765+
validate_load_response(data, `related to route '${route.id}'`);
792766
} finally {
793767
unlock_fetch();
794768
}
795769
} else {
796-
data = await traced_load();
770+
data = (await node.universal.load.call(null, load_input)) ?? null;
797771
}
798772
}
799773

packages/kit/src/runtime/client/types.d.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,6 @@ export interface SvelteKitApp {
5656
*/
5757
hash: boolean;
5858

59-
/**
60-
* Whether OpenTelemetry tracing is enabled (config.tracing === true || config.tracing === 'client')
61-
*/
62-
tracing: boolean;
63-
6459
root: typeof SvelteComponent;
6560
}
6661

packages/kit/src/runtime/server/data/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export async function render_data(
6363
event: new_event,
6464
state,
6565
node,
66-
tracing: options.tracing,
66+
tracer: await options.tracer,
6767
parent: async () => {
6868
/** @type {Record<string, any>} */
6969
const data = {};

packages/kit/src/runtime/server/page/actions.js

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { HttpError, Redirect, ActionFailure, SvelteKitError } from '../../contro
77
import { handle_error_and_jsonify } from '../utils.js';
88
import { with_event } from '../../app/server/event.js';
99
import { record_span } from '../../telemetry/record_span.js';
10-
import { get_tracer } from '../../telemetry/get_tracer.js';
1110

1211
/** @param {import('@sveltejs/kit').RequestEvent} event */
1312
export function is_action_json_request(event) {
@@ -53,7 +52,7 @@ export async function handle_action_json_request(event, options, server) {
5352
check_named_default_separate(actions);
5453

5554
try {
56-
const data = await call_action(event, actions, options.tracing);
55+
const data = await call_action(event, actions, await options.tracer);
5756

5857
if (__SVELTEKIT_DEV__) {
5958
validate_action_return(data);
@@ -141,10 +140,10 @@ export function is_action_request(event) {
141140
/**
142141
* @param {import('@sveltejs/kit').RequestEvent} event
143142
* @param {import('types').SSRNode['server'] | undefined} server
144-
* @param {boolean} tracing
143+
* @param {import('@opentelemetry/api').Tracer} tracer
145144
* @returns {Promise<import('@sveltejs/kit').ActionResult>}
146145
*/
147-
export async function handle_action_request(event, server, tracing) {
146+
export async function handle_action_request(event, server, tracer) {
148147
const actions = server?.actions;
149148

150149
if (!actions) {
@@ -167,7 +166,7 @@ export async function handle_action_request(event, server, tracing) {
167166
check_named_default_separate(actions);
168167

169168
try {
170-
const data = await call_action(event, actions, tracing);
169+
const data = await call_action(event, actions, tracer);
171170

172171
if (__SVELTEKIT_DEV__) {
173172
validate_action_return(data);
@@ -219,10 +218,10 @@ function check_named_default_separate(actions) {
219218
/**
220219
* @param {import('@sveltejs/kit').RequestEvent} event
221220
* @param {NonNullable<import('types').ServerNode['actions']>} actions
222-
* @param {boolean} tracing
221+
* @param {import('@opentelemetry/api').Tracer} tracer
223222
* @throws {Redirect | HttpError | SvelteKitError | Error}
224223
*/
225-
async function call_action(event, actions, tracing) {
224+
async function call_action(event, actions, tracer) {
226225
const url = new URL(event.request.url);
227226

228227
let name = 'default';
@@ -251,8 +250,6 @@ async function call_action(event, actions, tracing) {
251250
);
252251
}
253252

254-
const tracer = await get_tracer({ is_enabled: tracing });
255-
256253
return record_span({
257254
name: 'sveltekit.action',
258255
tracer,
@@ -267,11 +264,8 @@ async function call_action(event, actions, tracing) {
267264
'sveltekit.action.result.type': 'failure',
268265
'sveltekit.action.result.status': result.status
269266
});
270-
} else {
271-
action_span.setAttributes({
272-
'sveltekit.action.result.type': 'success'
273-
});
274267
}
268+
275269
return result;
276270
}
277271
});

packages/kit/src/runtime/server/page/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export async function render_page(event, page, options, manifest, state, nodes,
5656
if (is_action_request(event)) {
5757
// for action requests, first call handler in +page.server.js
5858
// (this also determines status code)
59-
action_result = await handle_action_request(event, leaf_node.server, options.tracing);
59+
action_result = await handle_action_request(event, leaf_node.server, await options.tracer);
6060
if (action_result?.type === 'redirect') {
6161
return redirect_response(action_result.status, action_result.location);
6262
}
@@ -167,7 +167,7 @@ export async function render_page(event, page, options, manifest, state, nodes,
167167
}
168168
return data;
169169
},
170-
tracing: options.tracing
170+
tracer: await options.tracer
171171
});
172172
} catch (e) {
173173
load_error = /** @type {Error} */ (e);
@@ -196,7 +196,7 @@ export async function render_page(event, page, options, manifest, state, nodes,
196196
server_data_promise: server_promises[i],
197197
state,
198198
csr,
199-
tracing: options.tracing
199+
tracer: await options.tracer
200200
});
201201
} catch (e) {
202202
load_error = /** @type {Error} */ (e);

0 commit comments

Comments
 (0)