Observabilité
Disponible depuis la version 2.31
Parfois, vous pouvez avoir besoin d’observer comment se comporte votre application pour en améliorer les performances ou trouver la source d’un bug vicieux. Pour vous aider dans cette tâche, SvelteKit peut émettre des spans OpenTelemetry côté serveur dans les fonctions suivantes :
- Le hook
handle
et les fonctionshandle
s’exécutant dans la fonctionsequence
(celles-ci sont des enfant l’une de l’autre et du hook racinehandle
) - Les fonctions
load
de serveur et les fonctionsload
universelles lorsqu’elles sont exécutées sur le serveur - Les actions de formulaire
- Les fonctions distantes
Toutefois, vous ne serez pas très avancé•e•s en vous contentant de dire à SvelteKit d’émettre des
spans — vous devez également les collecter quelque part pour être capables de les analyser.
SvelteKit fournit le fichier src/instrumentation.server.ts
comme emplacement pour écrire votre
configuration de suivi ainsi que votre code d’instrumentation. Le code de ce fichier est garanti
d’être exécuté avant que votre code applicatif ne soit importé, à condition que votre plateforme de
déploiement le supporte et que votre adapteur soit conscient de son existence.
Ces deux fonctionnalités sont actuellement expérimentales, ce qui signifie qu’elles peuvent contenir
des bugs et sont sujettes à des changements impromptus. Vous devez les activer en ajoutant les
options kit.experimental.tracing.server
et kit.experimental.instrumentation.server
dans votre
fichier svelte.config.js
:
/** @type {import('@sveltejs/kit').Config} */
const const config: {
kit: {
experimental: {
tracing: {
server: boolean;
};
instrumentation: {
server: boolean;
};
};
};
}
config = {
kit: {
experimental: {
tracing: {
server: boolean;
};
instrumentation: {
server: boolean;
};
};
}
kit: {
experimental: {
tracing: {
server: boolean;
};
instrumentation: {
server: boolean;
};
}
experimental: {
tracing: {
server: boolean;
}
tracing: {
server: boolean
server: true
},
instrumentation: {
server: boolean;
}instrumentation: {
server: boolean
server: true
}
}
}
};
export default const config: {
kit: {
experimental: {
tracing: {
server: boolean;
};
instrumentation: {
server: boolean;
};
};
};
}
config;Le suivi — et de manière plus significative, l’instrumentation de l’observabilité — peuvent avoir un surcoût non négligeable. Avant de vous lancer tête baissée dans ce sujet, envisagez si vous en avez réellement besoin, ou s’il serait plus approprié de l’activer uniquement pour les environnements de développement et de prévisualisation.
Améliorer le suivi intégré
SvelteKit fournit un accès au span root
et au span current
dans l’évènement de requête. Le span
racine est celui associé à votre fonction handle
racine, et le span courant peut être associé à
une fonction handle
, load
, une action de formulaire, ou une fonction distante, selon le
contexte. Vous pouvez annoter ces spans avec n’importe quel attribut que vous souhaitez enregistrer
:
import { function getRequestEvent(): RequestEvent
Returns the current RequestEvent
. Can be used inside server hooks, server load
functions, actions, and endpoints (and functions called by them).
In environments without AsyncLocalStorage
, this must be called synchronously (i.e. not after an await
).
getRequestEvent } from '$app/server';
import { function getAuthenticatedUser(): Promise<{
id: string;
}>
getAuthenticatedUser } from '$lib/auth-core';
async function function authenticate(): Promise<void>
authenticate() {
const const user: {
id: string;
}
user = await function getAuthenticatedUser(): Promise<{
id: string;
}>
getAuthenticatedUser();
const const event: RequestEvent<Record<string, string>, string | null>
event = function getRequestEvent(): RequestEvent
Returns the current RequestEvent
. Can be used inside server hooks, server load
functions, actions, and endpoints (and functions called by them).
In environments without AsyncLocalStorage
, this must be called synchronously (i.e. not after an await
).
getRequestEvent();
const event: RequestEvent<Record<string, string>, string | null>
event.RequestEvent<Record<string, string>, string | null>.tracing: {
enabled: boolean;
root: Span;
current: Span;
}
Access to spans for tracing. If tracing is not enabled, these spans will do nothing.
tracing.root: Span
The root span for the request. This span is named sveltekit.handle.root
.
root.setAttribute('userId', const user: {
id: string;
}
user.id: string
id);
}
Démarrage rapide pour le développement
Pour afficher votre première trace, vous devez mettre en place un collecteur local. Nous allons utiliser Jaeger dans cet exemple, puisqu’il fournit une commande de démarrage rapide simple à utiliser. Une fois que votre collecteur est en cours d’exécution localement :
- Activez les flags expérimentaux mentionnés plus haut dans votre fichier
svelte.config.js
- Utilisez votre gestionnaire de paquet pour installer les dépendances dont vous aurez besoin :
npm i @opentelemetry/sdk-node @opentelemetry/auto-instrumentations-node @opentelemetry/exporter-trace-otlp-proto import-in-the-middle
- Créez le fichier
src/instrumentation.server.js
avec le code suivant :
import { import NodeSDK
NodeSDK } from '@opentelemetry/sdk-node';
import { import getNodeAutoInstrumentations
getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { import OTLPTraceExporter
OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';
import { import createAddHookMessageChannel
createAddHookMessageChannel } from 'import-in-the-middle';
import { function register<Data = any>(specifier: string | URL, parentURL?: string | URL, options?: Module.RegisterOptions<Data>): void (+1 overload)
Register a module that exports hooks that customize Node.js module
resolution and loading behavior. See
Customization hooks.
register } from 'node:module';
const { const registerOptions: any
registerOptions } = import createAddHookMessageChannel
createAddHookMessageChannel();
register<any>(specifier: string | URL, parentURL?: string | URL, options?: Module.RegisterOptions<any> | undefined): void (+1 overload)
Register a module that exports hooks that customize Node.js module
resolution and loading behavior. See
Customization hooks.
register('import-in-the-middle/hook.mjs', import.meta.ImportMeta.url: string
The absolute file:
URL of the module.
url, const registerOptions: any
registerOptions);
const const sdk: any
sdk = new import NodeSDK
NodeSDK({
serviceName: string
serviceName: 'test-sveltekit-tracing',
traceExporter: any
traceExporter: new import OTLPTraceExporter
OTLPTraceExporter(),
instrumentations: any[]
instrumentations: [import getNodeAutoInstrumentations
getNodeAutoInstrumentations()]
});
const sdk: any
sdk.start();
À partir de maintenant, les requêtes côté serveur vont générer des traces, que vous pouvez afficher dans la console web de Jaeger sur localhost:16686.
@opentelemetry/api
SvelteKit utilise @opentelemetry/api
pour générer ses spans. Ce paquet est déclaré en tant que
peerDependency optionnelle afin que les utilisateurs et utilisatrices ne nécessitant pas de suivi ne
voient pas d’impact sur les tailles de bundle ou sur les performances d’exécution. Dans la plupart
des cas, si vous configurez votre application pour collecter les spans de SvelteKit, vous finirez
par installer une librairie comme @opentelemetry/sdk-node
ou @vercel/otel
, qui elles-mêmes
dépendent de @opentelemetry/api
, ce qui sera donc compatible avec les dépendances de SvelteKit. Si
vous voyez une erreur venant de SvelteKit vous disant qu’il n’arrive pas à trouver
@opentelemetry/api
, il est possible que vous n’ayez pas encore mis en place votre suivi. Si vous
l’avez fait et avez toujours l’erreur, vous pouvez installer le paquet @opentelemetry/api
vous-même.
Modifier cette page sur Github llms.txt