From 7b18c4034ddfb7317d6e5cc690b3f9e28ab35d85 Mon Sep 17 00:00:00 2001 From: "S. Elliott Johnson" Date: Mon, 16 Jun 2025 10:53:11 -0600 Subject: [PATCH 1/5] feat: Initial tracing setup (peer deps + utils) --- packages/kit/package.json | 7 ++ .../runtime/server/telemetry/get-tracer.js | 21 ++++++ .../runtime/server/telemetry/noop-tracer.js | 75 +++++++++++++++++++ .../runtime/server/telemetry/record-span.js | 65 ++++++++++++++++ .../runtime/server/telemetry/settings.d.ts | 11 +++ pnpm-lock.yaml | 9 +++ 6 files changed, 188 insertions(+) create mode 100644 packages/kit/src/runtime/server/telemetry/get-tracer.js create mode 100644 packages/kit/src/runtime/server/telemetry/noop-tracer.js create mode 100644 packages/kit/src/runtime/server/telemetry/record-span.js create mode 100644 packages/kit/src/runtime/server/telemetry/settings.d.ts diff --git a/packages/kit/package.json b/packages/kit/package.json index de12902b0fb6..c61bca2e52e3 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -33,6 +33,7 @@ "vitefu": "^1.0.6" }, "devDependencies": { + "@opentelemetry/api": "1.0.0", "@playwright/test": "catalog:", "@sveltejs/vite-plugin-svelte": "^5.0.1", "@types/connect": "^3.4.38", @@ -47,10 +48,16 @@ "vitest": "catalog:" }, "peerDependencies": { + "@opentelemetry/api": "1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "vite": "^5.0.3 || ^6.0.0" }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + } + }, "bin": { "svelte-kit": "svelte-kit.js" }, diff --git a/packages/kit/src/runtime/server/telemetry/get-tracer.js b/packages/kit/src/runtime/server/telemetry/get-tracer.js new file mode 100644 index 000000000000..28a5ab2558e8 --- /dev/null +++ b/packages/kit/src/runtime/server/telemetry/get-tracer.js @@ -0,0 +1,21 @@ +/** @import { Tracer } from '@opentelemetry/api' */ +import { trace } from '@opentelemetry/api'; +import { noop_tracer } from './noop-tracer.js'; + +/** + * @param {Object} [options={}] - Configuration options + * @param {boolean} [options.is_enabled=false] - Whether tracing is enabled + * @param {Tracer} [options.tracer] - Custom tracer instance + * @returns {Tracer} The tracer instance + */ +export function get_tracer({ is_enabled = false, tracer } = {}) { + if (!is_enabled) { + return noop_tracer; + } + + if (tracer) { + return tracer; + } + + return trace.getTracer('sveltekit'); +} diff --git a/packages/kit/src/runtime/server/telemetry/noop-tracer.js b/packages/kit/src/runtime/server/telemetry/noop-tracer.js new file mode 100644 index 000000000000..5029798626b3 --- /dev/null +++ b/packages/kit/src/runtime/server/telemetry/noop-tracer.js @@ -0,0 +1,75 @@ +/** @import { Tracer, Span, SpanContext } from '@opentelemetry/api' */ + +/** + * Tracer implementation that does nothing (null object). + * @type {Tracer} + */ +export const noop_tracer = { + /** + * @returns {Span} + */ + startSpan() { + return noop_span; + }, + + /** + * @param {unknown} _name + * @param {unknown} arg_1 + * @param {unknown} [arg_2] + * @param {Function} [arg_3] + * @returns {unknown} + */ + startActiveSpan(_name, arg_1, arg_2, arg_3) { + if (typeof arg_1 === 'function') { + return arg_1(noop_span); + } + if (typeof arg_2 === 'function') { + return arg_2(noop_span); + } + if (typeof arg_3 === 'function') { + return arg_3(noop_span); + } + } +}; + +/** + * @type {Span} + */ +const noop_span = { + spanContext() { + return noop_span_context; + }, + setAttribute() { + return this; + }, + setAttributes() { + return this; + }, + addEvent() { + return this; + }, + setStatus() { + return this; + }, + updateName() { + return this; + }, + end() { + return this; + }, + isRecording() { + return false; + }, + recordException() { + return this; + } +}; + +/** + * @type {SpanContext} + */ +const noop_span_context = { + traceId: '', + spanId: '', + traceFlags: 0 +}; diff --git a/packages/kit/src/runtime/server/telemetry/record-span.js b/packages/kit/src/runtime/server/telemetry/record-span.js new file mode 100644 index 000000000000..2ac51970a7ae --- /dev/null +++ b/packages/kit/src/runtime/server/telemetry/record-span.js @@ -0,0 +1,65 @@ +/** @import { SpanAttributes, SpanAttributeValue, Span, Tracer } from '@opentelemetry/api' */ +import { SpanStatusCode } from '@opentelemetry/api'; +import { HttpError, Redirect } from '../../control.js'; + +/** + * @template T + * @param {Object} options + * @param {string} options.name + * @param {Tracer} options.tracer + * @param {SpanAttributes} options.attributes + * @param {function(Span): Promise} options.fn + * @returns {Promise} + */ +export function record_span({ name, tracer, attributes, fn }) { + return tracer.startActiveSpan(name, { attributes }, async (span) => { + try { + const result = await fn(span); + span.end(); + return result; + } catch (error) { + if (error instanceof HttpError) { + span.setAttributes({ + [`${name}.result.type`]: 'known_error', + [`${name}.result.status`]: error.status, + [`${name}.result.message`]: error.body.message + }); + span.recordException({ + name: 'HttpError', + message: error.body.message + }); + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error.body.message + }); + } else if (error instanceof Redirect) { + span.setAttributes({ + [`${name}.result.type`]: 'redirect', + [`${name}.result.status`]: error.status, + [`${name}.result.location`]: error.location + }); + } else if (error instanceof Error) { + span.setAttributes({ + [`${name}.result.type`]: 'unknown_error' + }); + span.recordException({ + name: error.name, + message: error.message, + stack: error.stack + }); + span.setStatus({ + code: SpanStatusCode.ERROR, + message: error.message + }); + } else { + span.setAttributes({ + [`${name}.result.type`]: 'unknown_error' + }); + span.setStatus({ code: SpanStatusCode.ERROR }); + } + span.end(); + + throw error; + } + }); +} diff --git a/packages/kit/src/runtime/server/telemetry/settings.d.ts b/packages/kit/src/runtime/server/telemetry/settings.d.ts new file mode 100644 index 000000000000..3075dbfb00ff --- /dev/null +++ b/packages/kit/src/runtime/server/telemetry/settings.d.ts @@ -0,0 +1,11 @@ +/** + * Telemetry configuration. + */ +// This is meant to be both flexible for custom app requirements (metadata) +// and extensible for standardization (example: functionId, more to come). +export type TelemetrySettings = { + /** + * Enable or disable telemetry. Disabled by default while experimental. + */ + enabled?: boolean; +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ea016ce7a43f..334acbad79fe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -404,6 +404,9 @@ importers: specifier: ^1.0.6 version: 1.0.6(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) devDependencies: + '@opentelemetry/api': + specifier: 1.0.0 + version: 1.0.0 '@playwright/test': specifier: 'catalog:' version: 1.51.1 @@ -2022,6 +2025,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@opentelemetry/api@1.0.0': + resolution: {integrity: sha512-TcdhrGy+ehLIFs79/TcWiHiPujishrhSgQ7wxvWvk8WY2YT8Np/pYXmRP94voG3N8GJ/5nIVyzacfViwhN50AQ==} + engines: {node: '>=8.0.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -5359,6 +5366,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@opentelemetry/api@1.0.0': {} + '@pkgjs/parseargs@0.11.0': optional: true From 7e2832608aaff4eb38710f3c2001ed598c06a6fe Mon Sep 17 00:00:00 2001 From: "S. Elliott Johnson" Date: Mon, 16 Jun 2025 10:58:13 -0600 Subject: [PATCH 2/5] feat: Add tracing to load, handle, and actions --- packages/kit/src/runtime/client/client.js | 23 +- .../kit/src/runtime/server/page/actions.js | 27 ++- .../kit/src/runtime/server/page/load_data.js | 215 ++++++++++-------- packages/kit/src/runtime/server/respond.js | 89 +++++--- 4 files changed, 235 insertions(+), 119 deletions(-) diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 207da3dccc4f..6483ad1873a7 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -41,6 +41,8 @@ import { get_message, get_status } from '../../utils/error.js'; import { writable } from 'svelte/store'; import { page, update, navigating } from './state.svelte.js'; import { add_data_suffix, add_resolution_suffix } from '../pathname.js'; +import { record_span } from '../server/telemetry/record-span.js'; +import { get_tracer } from '../server/telemetry/get-tracer.js'; export { load_css }; @@ -753,10 +755,27 @@ async function load_node({ loader, parent, url, params, route, server_data_node } }; + async function traced_load() { + const tracer = get_tracer({ is_enabled: true }); // TODO: Make this configurable + + return record_span({ + name: 'sveltekit.load.universal', + tracer, + attributes: { + 'sveltekit.load.node_id': 'client-load', // TODO: can we actually get an id here? + 'sveltekit.load.type': 'universal', + 'sveltekit.load.environment': 'client', + 'sveltekit.route.id': route.id || 'unknown' + }, + fn: async () => (await node.universal?.load?.call(null, load_input)) ?? null + }); + } + if (DEV) { try { lock_fetch(); - data = (await node.universal.load.call(null, load_input)) ?? null; + data = await traced_load(); + if (data != null && Object.getPrototypeOf(data) !== Object.prototype) { throw new Error( `a load function related to route '${route.id}' returned ${ @@ -774,7 +793,7 @@ async function load_node({ loader, parent, url, params, route, server_data_node unlock_fetch(); } } else { - data = (await node.universal.load.call(null, load_input)) ?? null; + data = await traced_load(); } } diff --git a/packages/kit/src/runtime/server/page/actions.js b/packages/kit/src/runtime/server/page/actions.js index e7703359234e..dd0d85afa15f 100644 --- a/packages/kit/src/runtime/server/page/actions.js +++ b/packages/kit/src/runtime/server/page/actions.js @@ -6,6 +6,8 @@ import { is_form_content_type, negotiate } from '../../../utils/http.js'; import { HttpError, Redirect, ActionFailure, SvelteKitError } from '../../control.js'; import { handle_error_and_jsonify } from '../utils.js'; import { with_event } from '../../app/server/event.js'; +import { record_span } from '../telemetry/record-span.js'; +import { get_tracer } from '../telemetry/get-tracer.js'; /** @param {import('@sveltejs/kit').RequestEvent} event */ export function is_action_json_request(event) { @@ -247,7 +249,30 @@ async function call_action(event, actions) { ); } - return with_event(event, () => action(event)); + const tracer = get_tracer({ is_enabled: true }); // TODO: Make this configurable + + return record_span({ + name: 'sveltekit.action', + tracer, + attributes: { + 'sveltekit.action.name': name, + 'sveltekit.route.id': event.route.id || 'unknown' + }, + fn: async (action_span) => { + const result = await with_event(event, () => action(event)); + if (result instanceof ActionFailure) { + action_span.setAttributes({ + 'sveltekit.action.result.type': 'failure', + 'sveltekit.action.result.status': result.status + }); + } else { + action_span.setAttributes({ + 'sveltekit.action.result.type': 'success' + }); + } + return result; + } + }); } /** @param {any} data */ diff --git a/packages/kit/src/runtime/server/page/load_data.js b/packages/kit/src/runtime/server/page/load_data.js index 74bd7444af4f..dc0f05bc38bb 100644 --- a/packages/kit/src/runtime/server/page/load_data.js +++ b/packages/kit/src/runtime/server/page/load_data.js @@ -3,6 +3,8 @@ import { disable_search, make_trackable } from '../../../utils/url.js'; import { validate_depends } from '../../shared.js'; import { b64_encode } from '../../utils.js'; import { with_event } from '../../app/server/event.js'; +import { record_span } from '../telemetry/record-span.js'; +import { get_tracer } from '../telemetry/get-tracer.js'; /** * Calls the user's server `load` function. @@ -68,94 +70,109 @@ export async function load_server_data({ event, state, node, parent }) { let done = false; - const result = await with_event(event, () => - load.call(null, { - ...event, - fetch: (info, init) => { - const url = new URL(info instanceof Request ? info.url : info, event.url); + const tracer = get_tracer({ is_enabled: true }); // TODO: Make this configurable - if (DEV && done && !uses.dependencies.has(url.href)) { - console.warn( - `${node.server_id}: Calling \`event.fetch(...)\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the dependency is invalidated` - ); - } - - // Note: server fetches are not added to uses.depends due to security concerns - return event.fetch(info, init); - }, - /** @param {string[]} deps */ - depends: (...deps) => { - for (const dep of deps) { - const { href } = new URL(dep, event.url); - - if (DEV) { - validate_depends(node.server_id || 'missing route ID', dep); - - if (done && !uses.dependencies.has(href)) { + const result = await record_span({ + name: 'sveltekit.load.server', + tracer, + attributes: { + 'sveltekit.load.node_id': node.server_id || 'unknown', + 'sveltekit.load.type': 'server', + 'sveltekit.route.id': event.route.id || 'unknown' + }, + fn: async () => { + const result = await with_event(event, () => + load.call(null, { + ...event, + fetch: (info, init) => { + const url = new URL(info instanceof Request ? info.url : info, event.url); + + if (DEV && done && !uses.dependencies.has(url.href)) { console.warn( - `${node.server_id}: Calling \`depends(...)\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the dependency is invalidated` + `${node.server_id}: Calling \`event.fetch(...)\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the dependency is invalidated` ); } - } - - uses.dependencies.add(href); - } - }, - params: new Proxy(event.params, { - get: (target, key) => { - if (DEV && done && typeof key === 'string' && !uses.params.has(key)) { - console.warn( - `${node.server_id}: Accessing \`params.${String( - key - )}\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the param changes` - ); - } - if (is_tracking) { - uses.params.add(key); - } - return target[/** @type {string} */ (key)]; - } - }), - parent: async () => { - if (DEV && done && !uses.parent) { - console.warn( - `${node.server_id}: Calling \`parent(...)\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when parent data changes` - ); - } + // Note: server fetches are not added to uses.depends due to security concerns + return event.fetch(info, init); + }, + /** @param {string[]} deps */ + depends: (...deps) => { + for (const dep of deps) { + const { href } = new URL(dep, event.url); + + if (DEV) { + validate_depends(node.server_id || 'missing route ID', dep); + + if (done && !uses.dependencies.has(href)) { + console.warn( + `${node.server_id}: Calling \`depends(...)\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the dependency is invalidated` + ); + } + } + + uses.dependencies.add(href); + } + }, + params: new Proxy(event.params, { + get: (target, key) => { + if (DEV && done && typeof key === 'string' && !uses.params.has(key)) { + console.warn( + `${node.server_id}: Accessing \`params.${String( + key + )}\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the param changes` + ); + } + + if (is_tracking) { + uses.params.add(key); + } + return target[/** @type {string} */ (key)]; + } + }), + parent: async () => { + if (DEV && done && !uses.parent) { + console.warn( + `${node.server_id}: Calling \`parent(...)\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when parent data changes` + ); + } - if (is_tracking) { - uses.parent = true; - } - return parent(); - }, - route: new Proxy(event.route, { - get: (target, key) => { - if (DEV && done && typeof key === 'string' && !uses.route) { - console.warn( - `${node.server_id}: Accessing \`route.${String( - key - )}\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the route changes` - ); + if (is_tracking) { + uses.parent = true; + } + return parent(); + }, + route: new Proxy(event.route, { + get: (target, key) => { + if (DEV && done && typeof key === 'string' && !uses.route) { + console.warn( + `${node.server_id}: Accessing \`route.${String( + key + )}\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the route changes` + ); + } + + if (is_tracking) { + uses.route = true; + } + return target[/** @type {'id'} */ (key)]; + } + }), + url, + untrack(fn) { + is_tracking = false; + try { + return fn(); + } finally { + is_tracking = true; + } } + }) + ); - if (is_tracking) { - uses.route = true; - } - return target[/** @type {'id'} */ (key)]; - } - }), - url, - untrack(fn) { - is_tracking = false; - try { - return fn(); - } finally { - is_tracking = true; - } - } - }) - ); + return result; + } + }); if (__SVELTEKIT_DEV__) { validate_load_response(result, node.server_id); @@ -201,16 +218,34 @@ export async function load_data({ return server_data_node?.data ?? null; } - const result = await node.universal.load.call(null, { - url: event.url, - params: event.params, - data: server_data_node?.data ?? null, - route: event.route, - fetch: create_universal_fetch(event, state, fetched, csr, resolve_opts), - setHeaders: event.setHeaders, - depends: () => {}, - parent, - untrack: (fn) => fn() + const { load } = node.universal; + + const tracer = get_tracer({ is_enabled: true }); // TODO: Make this configurable + + const result = await record_span({ + name: 'sveltekit.load.universal', + tracer, + attributes: { + 'sveltekit.load.node_id': node.universal_id || 'unknown', + 'sveltekit.load.type': 'universal', + 'sveltekit.load.environment': 'client', + 'sveltekit.route.id': event.route.id || 'unknown' + }, + fn: async () => { + const result = await load.call(null, { + url: event.url, + params: event.params, + data: server_data_node?.data ?? null, + route: event.route, + fetch: create_universal_fetch(event, state, fetched, csr, resolve_opts), + setHeaders: event.setHeaders, + depends: () => {}, + parent, + untrack: (fn) => fn() + }); + + return result; + } }); if (__SVELTEKIT_DEV__) { diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index 783c7d0ee65a..d9dece40c65b 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -34,6 +34,8 @@ import { strip_resolution_suffix } from '../pathname.js'; import { with_event } from '../app/server/event.js'; +import { record_span } from './telemetry/record-span.js'; +import { get_tracer } from './telemetry/get-tracer.js'; /* global __SVELTEKIT_ADAPTER_NAME__ */ /* global __SVELTEKIT_DEV__ */ @@ -362,32 +364,67 @@ export async function respond(request, options, manifest, state) { disable_search(url); } - const response = await with_event(event, () => - options.hooks.handle({ - event, - resolve: (event, opts) => - // counter-intuitively, we need to clear the event, so that it's not - // e.g. accessible when loading modules needed to handle the request - with_event(null, () => - resolve(event, page_nodes, opts).then((response) => { - // add headers/cookies here, rather than inside `resolve`, so that we - // can do it once for all responses instead of once per `return` - for (const key in headers) { - const value = headers[key]; - response.headers.set(key, /** @type {string} */ (value)); - } - - add_cookies_to_headers(response.headers, Object.values(new_cookies)); - - if (state.prerendering && event.route.id !== null) { - response.headers.set('x-sveltekit-routeid', encodeURI(event.route.id)); - } - - return response; - }) - ) - }) - ); + const tracer = get_tracer({ is_enabled: true }); // TODO: Make this configurable via options + + const response = await record_span({ + name: 'sveltekit.handle', + tracer, + attributes: { + 'sveltekit.route.id': event.route.id || 'unknown', + 'http.method': event.request.method, + 'http.url': event.url.href, + 'sveltekit.is_data_request': is_data_request, + 'sveltekit.is_sub_request': event.isSubRequest + }, + fn: async () => { + return await with_event(event, () => + options.hooks.handle({ + event, + resolve: (event, opts) => { + return record_span({ + name: 'sveltekit.resolve', + tracer, + attributes: { + 'sveltekit.route.id': event.route.id || 'unknown', + 'sveltekit.resolve.transform_page_chunk': !!opts?.transformPageChunk, + 'sveltekit.resolve.filter_serialized_response_headers': + !!opts?.filterSerializedResponseHeaders, + 'sveltekit.resolve.preload': !!opts?.preload + }, + fn: async (resolveSpan) => { + // counter-intuitively, we need to clear the event, so that it's not + // e.g. accessible when loading modules needed to handle the request + return with_event(null, () => + resolve(event, page_nodes, opts).then((response) => { + // add headers/cookies here, rather than inside `resolve`, so that we + // can do it once for all responses instead of once per `return` + for (const key in headers) { + const value = headers[key]; + response.headers.set(key, /** @type {string} */ (value)); + } + + add_cookies_to_headers(response.headers, Object.values(new_cookies)); + + if (state.prerendering && event.route.id !== null) { + response.headers.set('x-sveltekit-routeid', encodeURI(event.route.id)); + } + + resolveSpan.setAttributes({ + 'http.response.status_code': response.status, + 'http.response.body.size': + response.headers.get('content-length') || 'unknown' + }); + + return response; + }) + ); + } + }); + } + }) + ); + } + }); // respond with 304 if etag matches if (response.status === 200 && response.headers.has('etag')) { From 02de6e71fb54026738ddc239be5821963f3a7728 Mon Sep 17 00:00:00 2001 From: "S. Elliott Johnson" Date: Mon, 16 Jun 2025 11:00:54 -0600 Subject: [PATCH 3/5] fix: Use ^ --- packages/kit/package.json | 4 ++-- pnpm-lock.yaml | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/packages/kit/package.json b/packages/kit/package.json index c61bca2e52e3..190174bb6658 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -33,7 +33,7 @@ "vitefu": "^1.0.6" }, "devDependencies": { - "@opentelemetry/api": "1.0.0", + "@opentelemetry/api": "^1.0.0", "@playwright/test": "catalog:", "@sveltejs/vite-plugin-svelte": "^5.0.1", "@types/connect": "^3.4.38", @@ -48,7 +48,7 @@ "vitest": "catalog:" }, "peerDependencies": { - "@opentelemetry/api": "1.0.0", + "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "vite": "^5.0.3 || ^6.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 334acbad79fe..e7100664cd7f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -311,7 +311,7 @@ importers: dependencies: '@sveltejs/kit': specifier: ^1.0.0 || ^2.0.0 - version: link:../kit + version: 2.21.5(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) devDependencies: typescript: specifier: ^5.3.3 @@ -405,7 +405,7 @@ importers: version: 1.0.6(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) devDependencies: '@opentelemetry/api': - specifier: 1.0.0 + specifier: ^1.0.0 version: 1.0.0 '@playwright/test': specifier: 'catalog:' @@ -2203,6 +2203,15 @@ packages: typescript: '>= 5' typescript-eslint: '>= 7.5' + '@sveltejs/kit@2.21.5': + resolution: {integrity: sha512-P5m7yZtvD1Kx/Z6JcjgJtdMqef/tCGMDrd9B9S2q8j+FMnkeKTMxW1nidnjVzk4HEDRGf4IlBI94/niy6t3hLA==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.3 || ^6.0.0 + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22} @@ -5498,6 +5507,25 @@ snapshots: typescript: 5.8.3 typescript-eslint: 8.26.0(eslint@9.6.0)(typescript@5.8.3) + '@sveltejs/kit@2.21.5(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1))': + dependencies: + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) + '@types/cookie': 0.6.0 + acorn: 8.14.1 + cookie: 0.6.0 + devalue: 5.1.0 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.17 + mrmime: 2.0.0 + sade: 1.8.1 + set-cookie-parser: 2.6.0 + sirv: 3.0.0 + svelte: 5.23.1 + vite: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) + vitefu: 1.0.6(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) From 8827f073aa8a2213400b2f7d23ff91eaabfea2e7 Mon Sep 17 00:00:00 2001 From: "S. Elliott Johnson" Date: Mon, 16 Jun 2025 11:56:15 -0600 Subject: [PATCH 4/5] format --- packages/kit/src/runtime/server/telemetry/settings.d.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/kit/src/runtime/server/telemetry/settings.d.ts b/packages/kit/src/runtime/server/telemetry/settings.d.ts index 3075dbfb00ff..adcbd769ca4f 100644 --- a/packages/kit/src/runtime/server/telemetry/settings.d.ts +++ b/packages/kit/src/runtime/server/telemetry/settings.d.ts @@ -4,8 +4,8 @@ // This is meant to be both flexible for custom app requirements (metadata) // and extensible for standardization (example: functionId, more to come). export type TelemetrySettings = { - /** - * Enable or disable telemetry. Disabled by default while experimental. - */ - enabled?: boolean; + /** + * Enable or disable telemetry. Disabled by default while experimental. + */ + enabled?: boolean; }; From f52694018c5479fa405840a32a2a982cdd3d217d Mon Sep 17 00:00:00 2001 From: "S. Elliott Johnson" Date: Mon, 16 Jun 2025 13:11:53 -0600 Subject: [PATCH 5/5] lint --- packages/kit/src/runtime/server/telemetry/record-span.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kit/src/runtime/server/telemetry/record-span.js b/packages/kit/src/runtime/server/telemetry/record-span.js index 2ac51970a7ae..13ddb70fb92b 100644 --- a/packages/kit/src/runtime/server/telemetry/record-span.js +++ b/packages/kit/src/runtime/server/telemetry/record-span.js @@ -1,4 +1,4 @@ -/** @import { SpanAttributes, SpanAttributeValue, Span, Tracer } from '@opentelemetry/api' */ +/** @import { SpanAttributes, Span, Tracer } from '@opentelemetry/api' */ import { SpanStatusCode } from '@opentelemetry/api'; import { HttpError, Redirect } from '../../control.js';