Skip to content

Commit 2991158

Browse files
feat: add universal IDs to client nodes
1 parent 3c2fce7 commit 2991158

File tree

17 files changed

+89
-144
lines changed

17 files changed

+89
-144
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: '',
@@ -407,58 +407,59 @@ test('errors on loading config with incorrect default export', async () => {
407407
});
408408

409409
test('accepts valid tracing values', () => {
410-
// Test boolean values
411410
assert.doesNotThrow(() => {
412411
validate_config({
413412
kit: {
414-
tracing: true
413+
tracing: 'server'
415414
}
416415
});
417416
});
418417

419418
assert.doesNotThrow(() => {
420419
validate_config({
421420
kit: {
422-
tracing: false
421+
tracing: undefined
423422
}
424423
});
425424
});
425+
});
426426

427-
// Test string values
428-
assert.doesNotThrow(() => {
427+
test('errors on invalid tracing values', () => {
428+
assert.throws(() => {
429429
validate_config({
430430
kit: {
431-
tracing: 'server'
431+
// @ts-expect-error - given value expected to throw
432+
tracing: true
432433
}
433434
});
434-
});
435+
}, /^config\.kit\.tracing should be undefined or "server"$/);
435436

436-
assert.doesNotThrow(() => {
437+
assert.throws(() => {
437438
validate_config({
438439
kit: {
439-
tracing: 'client'
440+
// @ts-expect-error - given value expected to throw
441+
tracing: false
440442
}
441443
});
442-
});
444+
}, /^config\.kit\.tracing should be undefined or "server"$/);
443445

444-
assert.doesNotThrow(() => {
446+
assert.throws(() => {
445447
validate_config({
446448
kit: {
447-
tracing: undefined
449+
// @ts-expect-error - given value expected to throw
450+
tracing: 'client'
448451
}
449452
});
450-
});
451-
});
453+
}, /^config\.kit\.tracing should be undefined or "server"$/);
452454

453-
test('errors on invalid tracing values', () => {
454455
assert.throws(() => {
455456
validate_config({
456457
kit: {
457458
// @ts-expect-error - given value expected to throw
458459
tracing: 'invalid'
459460
}
460461
});
461-
}, /^config\.kit\.tracing should be true, false, "server", or "client"$/);
462+
}, /^config\.kit\.tracing should be undefined or "server"$/);
462463

463464
assert.throws(() => {
464465
validate_config({
@@ -467,7 +468,7 @@ test('errors on invalid tracing values', () => {
467468
tracing: 42
468469
}
469470
});
470-
}, /^config\.kit\.tracing should be true, false, "server", or "client"$/);
471+
}, /^config\.kit\.tracing should be undefined or "server"$/);
471472

472473
assert.throws(() => {
473474
validate_config({
@@ -476,5 +477,5 @@ test('errors on invalid tracing values', () => {
476477
tracing: null
477478
}
478479
});
479-
}, /^config\.kit\.tracing should be true, false, "server", or "client"$/);
480+
}, /^config\.kit\.tracing should be undefined or "server"$/);
480481
});

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
@@ -687,15 +687,11 @@ export interface KitConfig {
687687
files?(filepath: string): boolean;
688688
};
689689
/**
690-
* Whether to enable OpenTelemetry tracing for SvelteKit operations including handle hooks, load functions, and form actions.
691-
* - `true` - Enable tracing for both server and client
692-
* - `false` - Disable tracing
693-
* - `'server'` - Enable tracing only on the server side
694-
* - `'client'` - Enable tracing only on the client side
695-
* @default false
690+
* Whether to enable serverside OpenTelemetry tracing for SvelteKit operations including handle hooks, load functions, and form actions.
691+
* @default undefined
696692
* @since 2.22.0
697693
*/
698-
tracing?: boolean | 'server' | 'client';
694+
tracing?: 'server';
699695
typescript?: {
700696
/**
701697
* 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
@@ -39,13 +39,16 @@ import {
3939
} from './constants.js';
4040
import { validate_page_exports } from '../../utils/exports.js';
4141
import { compact } from '../../utils/array.js';
42-
import { INVALIDATED_PARAM, TRAILING_SLASH_PARAM, validate_depends } from '../shared.js';
42+
import {
43+
INVALIDATED_PARAM,
44+
TRAILING_SLASH_PARAM,
45+
validate_depends,
46+
validate_load_response
47+
} from '../shared.js';
4348
import { get_message, get_status } from '../../utils/error.js';
4449
import { writable } from 'svelte/store';
4550
import { page, update, navigating } from './state.svelte.js';
4651
import { add_data_suffix, add_resolution_suffix } from '../pathname.js';
47-
import { record_span } from '../telemetry/record_span.js';
48-
import { get_tracer } from '../telemetry/get_tracer.js';
4952

5053
export { load_css };
5154

@@ -761,45 +764,16 @@ async function load_node({ loader, parent, url, params, route, server_data_node
761764
}
762765
};
763766

764-
async function traced_load() {
765-
const tracer = await get_tracer({ is_enabled: app.tracing });
766-
767-
return record_span({
768-
name: 'sveltekit.load.universal',
769-
tracer,
770-
attributes: {
771-
'sveltekit.load.node_id': node.universal_id || 'unknown',
772-
'sveltekit.load.type': 'universal',
773-
'sveltekit.load.environment': 'client',
774-
'sveltekit.route.id': route.id || 'unknown'
775-
},
776-
fn: async () => (await node.universal?.load?.call(null, load_input)) ?? null
777-
});
778-
}
779-
780767
if (DEV) {
781768
try {
782769
lock_fetch();
783-
data = await traced_load();
784-
785-
if (data != null && Object.getPrototypeOf(data) !== Object.prototype) {
786-
throw new Error(
787-
`the load function located in ${node.universal_id} returned ${
788-
typeof data !== 'object'
789-
? `a ${typeof data}`
790-
: data instanceof Response
791-
? 'a Response object'
792-
: Array.isArray(data)
793-
? 'an array'
794-
: 'a non-plain object'
795-
}, but must return a plain object at the top level (i.e. \`return {...}\`)`
796-
);
797-
}
770+
data = (await node.universal.load.call(null, load_input)) ?? null;
771+
validate_load_response(data, `related to route '${route.id}'`);
798772
} finally {
799773
unlock_fetch();
800774
}
801775
} else {
802-
data = await traced_load();
776+
data = (await node.universal.load.call(null, load_input)) ?? null;
803777
}
804778
}
805779

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 { is_form_content_type, negotiate } from '../../../utils/http.js';
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)