Canal de diagnostics
[Historique]
Version | Changements |
---|---|
v19.2.0, v18.13.0 | diagnostics_channel est maintenant Stable. |
v15.1.0, v14.17.0 | Ajouté dans : v15.1.0, v14.17.0 |
[Stable: 2 - Stable]
Stable: 2 Stabilité: 2 - Stable
Code Source : lib/diagnostics_channel.js
Le module node:diagnostics_channel
fournit une API pour créer des canaux nommés afin de signaler des données de message arbitraires à des fins de diagnostic.
Il est accessible en utilisant :
import diagnostics_channel from 'node:diagnostics_channel'
const diagnostics_channel = require('node:diagnostics_channel')
Il est prévu qu’un auteur de module souhaitant signaler des messages de diagnostic crée un ou plusieurs canaux de niveau supérieur pour signaler les messages. Les canaux peuvent également être acquis au moment de l’exécution, mais cela n’est pas encouragé en raison de la surcharge supplémentaire que cela implique. Les canaux peuvent être exportés par commodité, mais tant que le nom est connu, il peut être acquis n’importe où.
Si vous avez l’intention que votre module produise des données de diagnostic que d’autres peuvent utiliser, il est recommandé d’inclure une documentation sur les canaux nommés qui sont utilisés ainsi que sur la forme des données du message. Les noms de canal doivent généralement inclure le nom du module afin d’éviter les collisions avec les données provenant d’autres modules.
API publique
Vue d’ensemble
Voici un simple aperçu de l’API publique.
import diagnostics_channel from 'node:diagnostics_channel'
// Obtenir un objet de canal réutilisable
const channel = diagnostics_channel.channel('my-channel')
function onMessage(message, name) {
// Données reçues
}
// S’abonner au canal
diagnostics_channel.subscribe('my-channel', onMessage)
// Vérifier si le canal a un abonné actif
if (channel.hasSubscribers) {
// Publier des données sur le canal
channel.publish({
some: 'data',
})
}
// Se désabonner du canal
diagnostics_channel.unsubscribe('my-channel', onMessage)
const diagnostics_channel = require('node:diagnostics_channel')
// Obtenir un objet de canal réutilisable
const channel = diagnostics_channel.channel('my-channel')
function onMessage(message, name) {
// Données reçues
}
// S’abonner au canal
diagnostics_channel.subscribe('my-channel', onMessage)
// Vérifier si le canal a un abonné actif
if (channel.hasSubscribers) {
// Publier des données sur le canal
channel.publish({
some: 'data',
})
}
// Se désabonner du canal
diagnostics_channel.unsubscribe('my-channel', onMessage)
diagnostics_channel.hasSubscribers(name)
Ajouté dans : v15.1.0, v14.17.0
Vérifie s’il existe des abonnés actifs au canal nommé. Ceci est utile si le message que vous souhaitez envoyer peut être coûteux à préparer.
Cette API est facultative, mais utile lorsque vous essayez de publier des messages à partir d’un code très sensible aux performances.
import diagnostics_channel from 'node:diagnostics_channel'
if (diagnostics_channel.hasSubscribers('my-channel')) {
// Il y a des abonnés, préparer et publier le message
}
const diagnostics_channel = require('node:diagnostics_channel')
if (diagnostics_channel.hasSubscribers('my-channel')) {
// Il y a des abonnés, préparer et publier le message
}
diagnostics_channel.channel(name)
Ajouté dans : v15.1.0, v14.17.0
Il s’agit du principal point d’entrée pour quiconque souhaite publier sur un canal nommé. Il produit un objet de canal optimisé pour réduire autant que possible la surcharge au moment de la publication.
import diagnostics_channel from 'node:diagnostics_channel'
const channel = diagnostics_channel.channel('my-channel')
const diagnostics_channel = require('node:diagnostics_channel')
const channel = diagnostics_channel.channel('my-channel')
diagnostics_channel.subscribe(name, onMessage)
Ajouté dans : v18.7.0, v16.17.0
name
<string> | <symbol> Le nom du canalonMessage
<Function> Le gestionnaire pour recevoir les messages du canal
Enregistre un gestionnaire de messages pour s’abonner à ce canal. Ce gestionnaire de messages sera exécuté de manière synchrone chaque fois qu’un message sera publié sur le canal. Toute erreur levée dans le gestionnaire de messages déclenchera un 'uncaughtException'
.
import diagnostics_channel from 'node:diagnostics_channel'
diagnostics_channel.subscribe('my-channel', (message, name) => {
// Données reçues
})
const diagnostics_channel = require('node:diagnostics_channel')
diagnostics_channel.subscribe('my-channel', (message, name) => {
// Données reçues
})
diagnostics_channel.unsubscribe(name, onMessage)
Ajouté dans : v18.7.0, v16.17.0
name
<string> | <symbol> Le nom du canalonMessage
<Function> Le gestionnaire précédemment abonné à supprimer- Retourne : <boolean>
true
si le gestionnaire a été trouvé,false
sinon.
Supprime un gestionnaire de messages précédemment enregistré auprès de ce canal avec diagnostics_channel.subscribe(name, onMessage)
.
import diagnostics_channel from 'node:diagnostics_channel'
function onMessage(message, name) {
// Données reçues
}
diagnostics_channel.subscribe('my-channel', onMessage)
diagnostics_channel.unsubscribe('my-channel', onMessage)
const diagnostics_channel = require('node:diagnostics_channel')
function onMessage(message, name) {
// Données reçues
}
diagnostics_channel.subscribe('my-channel', onMessage)
diagnostics_channel.unsubscribe('my-channel', onMessage)
diagnostics_channel.tracingChannel(nameOrChannels)
Ajouté dans : v19.9.0, v18.19.0
[Stable : 1 - Expérimental]
Stable : 1 Stabilité : 1 - Expérimental
nameOrChannels
<string> | <TracingChannel> Nom du canal ou objet contenant tous les Canaux TracingChannel- Retourne : <TracingChannel> Collection de canaux à suivre
Crée un wrapper TracingChannel
pour les Canaux TracingChannel donnés. Si un nom est donné, les canaux de suivi correspondants seront créés sous la forme tracing:${name}:${eventType}
où eventType
correspond aux types de Canaux TracingChannel.
import diagnostics_channel from 'node:diagnostics_channel'
const channelsByName = diagnostics_channel.tracingChannel('my-channel')
// ou...
const channelsByCollection = diagnostics_channel.tracingChannel({
start: diagnostics_channel.channel('tracing:my-channel:start'),
end: diagnostics_channel.channel('tracing:my-channel:end'),
asyncStart: diagnostics_channel.channel('tracing:my-channel:asyncStart'),
asyncEnd: diagnostics_channel.channel('tracing:my-channel:asyncEnd'),
error: diagnostics_channel.channel('tracing:my-channel:error'),
})
const diagnostics_channel = require('node:diagnostics_channel')
const channelsByName = diagnostics_channel.tracingChannel('my-channel')
// ou...
const channelsByCollection = diagnostics_channel.tracingChannel({
start: diagnostics_channel.channel('tracing:my-channel:start'),
end: diagnostics_channel.channel('tracing:my-channel:end'),
asyncStart: diagnostics_channel.channel('tracing:my-channel:asyncStart'),
asyncEnd: diagnostics_channel.channel('tracing:my-channel:asyncEnd'),
error: diagnostics_channel.channel('tracing:my-channel:error'),
})
Classe : Channel
Ajouté dans : v15.1.0, v14.17.0
La classe Channel
représente un canal nommé individuel au sein du pipeline de données. Elle est utilisée pour suivre les abonnés et publier des messages lorsqu’il y a des abonnés présents. Elle existe en tant qu’objet séparé pour éviter les recherches de canaux au moment de la publication, ce qui permet des vitesses de publication très rapides et une utilisation intensive tout en engendrant un coût très minime. Les canaux sont créés avec diagnostics_channel.channel(name)
, la construction d’un canal directement avec new Channel(name)
n’est pas prise en charge.
channel.hasSubscribers
Ajouté dans : v15.1.0, v14.17.0
- Retourne : <boolean> Si des abonnés sont actifs
Vérifie s’il existe des abonnés actifs à ce canal. Ceci est utile si le message que vous souhaitez envoyer peut être coûteux à préparer.
Cette API est facultative, mais utile lorsque vous essayez de publier des messages à partir de code très sensible aux performances.
import diagnostics_channel from 'node:diagnostics_channel'
const channel = diagnostics_channel.channel('my-channel')
if (channel.hasSubscribers) {
// Il y a des abonnés, préparer et publier le message
}
const diagnostics_channel = require('node:diagnostics_channel')
const channel = diagnostics_channel.channel('my-channel')
if (channel.hasSubscribers) {
// Il y a des abonnés, préparer et publier le message
}
channel.publish(message)
Ajouté dans : v15.1.0, v14.17.0
message
<any> Le message à envoyer aux abonnés du canal
Publie un message à tous les abonnés du canal. Cela déclenchera les gestionnaires de messages de manière synchrone, de sorte qu’ils s’exécuteront dans le même contexte.
import diagnostics_channel from 'node:diagnostics_channel'
const channel = diagnostics_channel.channel('my-channel')
channel.publish({
some: 'message',
})
const diagnostics_channel = require('node:diagnostics_channel')
const channel = diagnostics_channel.channel('my-channel')
channel.publish({
some: 'message',
})
channel.subscribe(onMessage)
Ajouté dans : v15.1.0, v14.17.0
Déprécié depuis : v18.7.0, v16.17.0
[Stable : 0 - Déprécié]
Stable : 0 Stabilité : 0 - Déprécié : Utilisez diagnostics_channel.subscribe(name, onMessage)
onMessage
<Function> Le gestionnaire pour recevoir les messages du canal
Enregistre un gestionnaire de messages pour s’abonner à ce canal. Ce gestionnaire de messages sera exécuté de manière synchrone chaque fois qu’un message est publié sur le canal. Toute erreur levée dans le gestionnaire de messages déclenchera un événement 'uncaughtException'
.
import diagnostics_channel from 'node:diagnostics_channel'
const channel = diagnostics_channel.channel('my-channel')
channel.subscribe((message, name) => {
// Données reçues
})
const diagnostics_channel = require('node:diagnostics_channel')
const channel = diagnostics_channel.channel('my-channel')
channel.subscribe((message, name) => {
// Données reçues
})
channel.unsubscribe(onMessage)
[Historique]
Version | Modifications |
---|---|
v18.7.0, v16.17.0 | Déprécié depuis : v18.7.0, v16.17.0 |
v17.1.0, v16.14.0, v14.19.0 | Valeur de retour ajoutée. Ajouté aux canaux sans abonnés. |
v15.1.0, v14.17.0 | Ajouté dans : v15.1.0, v14.17.0 |
[Stable : 0 - Déprécié]
Stable : 0 Stabilité : 0 - Déprécié : Utilisez diagnostics_channel.unsubscribe(name, onMessage)
onMessage
<Function> Le gestionnaire précédemment abonné à supprimer- Retourne : <boolean>
true
si le gestionnaire a été trouvé,false
sinon.
Supprime un gestionnaire de messages précédemment enregistré auprès de ce canal avec channel.subscribe(onMessage)
.
import diagnostics_channel from 'node:diagnostics_channel'
const channel = diagnostics_channel.channel('my-channel')
function onMessage(message, name) {
// Données reçues
}
channel.subscribe(onMessage)
channel.unsubscribe(onMessage)
const diagnostics_channel = require('node:diagnostics_channel')
const channel = diagnostics_channel.channel('my-channel')
function onMessage(message, name) {
// Données reçues
}
channel.subscribe(onMessage)
channel.unsubscribe(onMessage)
channel.bindStore(store[, transform])
Ajouté dans : v19.9.0, v18.19.0
[Stable : 1 - Expérimental]
Stable : 1 Stabilité : 1 - Expérimental
store
<AsyncLocalStorage> Le store auquel lier les données de contextetransform
<Function> Transforme les données de contexte avant de définir le contexte du store
Lorsque channel.runStores(context, ...)
est appelé, les données de contexte données seront appliquées à tout store lié au canal. Si le store a déjà été lié, la fonction transform
précédente sera remplacée par la nouvelle. La fonction transform
peut être omise pour définir directement les données de contexte données comme contexte.
import diagnostics_channel from 'node:diagnostics_channel'
import { AsyncLocalStorage } from 'node:async_hooks'
const store = new AsyncLocalStorage()
const channel = diagnostics_channel.channel('my-channel')
channel.bindStore(store, data => {
return { data }
})
const diagnostics_channel = require('node:diagnostics_channel')
const { AsyncLocalStorage } = require('node:async_hooks')
const store = new AsyncLocalStorage()
const channel = diagnostics_channel.channel('my-channel')
channel.bindStore(store, data => {
return { data }
})
channel.unbindStore(store)
Ajouté dans : v19.9.0, v18.19.0
[Stable : 1 - Expérimental]
Stable : 1 Stabilité : 1 - Expérimental
store
<AsyncLocalStorage> Le store à dissocier du canal.- Retourne : <boolean>
true
si le store a été trouvé,false
sinon.
Supprime un gestionnaire de messages précédemment enregistré sur ce canal avec channel.bindStore(store)
.
import diagnostics_channel from 'node:diagnostics_channel'
import { AsyncLocalStorage } from 'node:async_hooks'
const store = new AsyncLocalStorage()
const channel = diagnostics_channel.channel('my-channel')
channel.bindStore(store)
channel.unbindStore(store)
const diagnostics_channel = require('node:diagnostics_channel')
const { AsyncLocalStorage } = require('node:async_hooks')
const store = new AsyncLocalStorage()
const channel = diagnostics_channel.channel('my-channel')
channel.bindStore(store)
channel.unbindStore(store)
channel.runStores(context, fn[, thisArg[, ...args]])
Ajouté dans : v19.9.0, v18.19.0
[Stable: 1 - Expérimental]
Stable: 1 Stabilité: 1 - Expérimental
context
<any> Message à envoyer aux abonnés et à lier aux magasinsfn
<Function> Gestionnaire à exécuter dans le contexte de stockage saisithisArg
<any> Le récepteur à utiliser pour l'appel de la fonction....args
<any> Arguments optionnels à passer à la fonction.
Applique les données fournies à toutes les instances AsyncLocalStorage liées au canal pendant la durée de la fonction donnée, puis publie sur le canal dans la portée de ces données appliquées aux magasins.
Si une fonction de transformation a été donnée à channel.bindStore(store)
, elle sera appliquée pour transformer les données du message avant qu'elles ne deviennent la valeur de contexte pour le magasin. Le contexte de stockage précédent est accessible depuis la fonction de transformation dans les cas où une liaison de contexte est requise.
Le contexte appliqué au magasin doit être accessible dans tout code asynchrone qui continue à partir de l'exécution qui a commencé pendant la fonction donnée, cependant il existe certaines situations dans lesquelles une perte de contexte peut se produire.
import diagnostics_channel from 'node:diagnostics_channel'
import { AsyncLocalStorage } from 'node:async_hooks'
const store = new AsyncLocalStorage()
const channel = diagnostics_channel.channel('my-channel')
channel.bindStore(store, message => {
const parent = store.getStore()
return new Span(message, parent)
})
channel.runStores({ some: 'message' }, () => {
store.getStore() // Span({ some: 'message' })
})
const diagnostics_channel = require('node:diagnostics_channel')
const { AsyncLocalStorage } = require('node:async_hooks')
const store = new AsyncLocalStorage()
const channel = diagnostics_channel.channel('my-channel')
channel.bindStore(store, message => {
const parent = store.getStore()
return new Span(message, parent)
})
channel.runStores({ some: 'message' }, () => {
store.getStore() // Span({ some: 'message' })
})
Classe : TracingChannel
Ajoutée dans : v19.9.0, v18.19.0
[Stable : 1 - Expérimental]
Stable : 1 Stabilité : 1 - Expérimental
La classe TracingChannel
est un ensemble de canaux TracingChannel qui, ensemble, expriment une seule action traçable. Elle est utilisée pour formaliser et simplifier le processus de production d’événements pour le traçage du flux d’application. diagnostics_channel.tracingChannel()
est utilisé pour construire un TracingChannel
. Comme pour Channel
, il est recommandé de créer et de réutiliser un seul TracingChannel
au niveau supérieur du fichier plutôt que de les créer dynamiquement.
tracingChannel.subscribe(subscribers)
Ajoutée dans : v19.9.0, v18.19.0
[Stable : 1 - Expérimental]
Stable : 1 Stabilité : 1 - Expérimental
subscribers
<Object> Ensemble d’abonnés aux canaux TracingChannelstart
<Fonction> L’abonné à l’événement start
end
<Fonction> L’abonné à l’événement end
asyncStart
<Fonction> L’abonné à l’événement asyncStart
asyncEnd
<Fonction> L’abonné à l’événement asyncEnd
error
<Fonction> L’abonné à l’événement error
Aide pour abonner un ensemble de fonctions aux canaux correspondants. C’est la même chose que d’appeler channel.subscribe(onMessage)
sur chaque canal individuellement.
import diagnostics_channel from 'node:diagnostics_channel'
const channels = diagnostics_channel.tracingChannel('my-channel')
channels.subscribe({
start(message) {
// Handle start message
},
end(message) {
// Handle end message
},
asyncStart(message) {
// Handle asyncStart message
},
asyncEnd(message) {
// Handle asyncEnd message
},
error(message) {
// Handle error message
},
})
const diagnostics_channel = require('node:diagnostics_channel')
const channels = diagnostics_channel.tracingChannel('my-channel')
channels.subscribe({
start(message) {
// Handle start message
},
end(message) {
// Handle end message
},
asyncStart(message) {
// Handle asyncStart message
},
asyncEnd(message) {
// Handle asyncEnd message
},
error(message) {
// Handle error message
},
})
tracingChannel.unsubscribe(subscribers)
Ajouté dans : v19.9.0, v18.19.0
[Stable: 1 - Expérimental]
Stable: 1 Stabilité: 1 - Expérimental
subscribers
<Object> Ensemble d'abonnés aux Canaux TracingChannelstart
<Function> L'abonné à l'événementstart
end
<Function> L'abonné à l'événementend
asyncStart
<Function> L'abonné à l'événementasyncStart
asyncEnd
<Function> L'abonné à l'événementasyncEnd
error
<Function> L'abonné à l'événementerror
Retourne: <boolean>
true
si tous les gestionnaires ont été désabonnés avec succès, etfalse
sinon.
Aide pour désabonner une collection de fonctions des canaux correspondants. Cela revient au même que d'appeler channel.unsubscribe(onMessage)
sur chaque canal individuellement.
import diagnostics_channel from 'node:diagnostics_channel'
const channels = diagnostics_channel.tracingChannel('my-channel')
channels.unsubscribe({
start(message) {
// Handle start message
},
end(message) {
// Handle end message
},
asyncStart(message) {
// Handle asyncStart message
},
asyncEnd(message) {
// Handle asyncEnd message
},
error(message) {
// Handle error message
},
})
const diagnostics_channel = require('node:diagnostics_channel')
const channels = diagnostics_channel.tracingChannel('my-channel')
channels.unsubscribe({
start(message) {
// Handle start message
},
end(message) {
// Handle end message
},
asyncStart(message) {
// Handle asyncStart message
},
asyncEnd(message) {
// Handle asyncEnd message
},
error(message) {
// Handle error message
},
})
tracingChannel.traceSync(fn[, context[, thisArg[, ...args]]])
Ajouté dans : v19.9.0, v18.19.0
[Stable: 1 - Expérimental]
Stable: 1 Stabilité: 1 - Expérimental
fn
<Function> Fonction autour de laquelle envelopper une tracecontext
<Object> Objet partagé pour corréler les événementsthisArg
<any> Le récepteur à utiliser pour l'appel de la fonction...args
<any> Arguments optionnels à passer à la fonction- Retourne : <any> La valeur de retour de la fonction donnée
Trace un appel de fonction synchrone. Cela produira toujours un événement start
et un événement end
autour de l'exécution et peut produire un événement error
si la fonction donnée lève une erreur. Cela exécutera la fonction donnée en utilisant channel.runStores(context, ...)
sur le canal start
ce qui garantit que tous les événements doivent avoir tous les magasins liés définis pour correspondre à ce contexte de trace.
Pour garantir que seuls les graphes de trace corrects sont formés, les événements ne seront publiés que si des abonnés sont présents avant de démarrer la trace. Les abonnements qui sont ajoutés après le début de la trace ne recevront pas les événements futurs de cette trace, seules les futures traces seront vues.
import diagnostics_channel from 'node:diagnostics_channel'
const channels = diagnostics_channel.tracingChannel('my-channel')
channels.traceSync(
() => {
// Do something
},
{
some: 'thing',
}
)
const diagnostics_channel = require('node:diagnostics_channel')
const channels = diagnostics_channel.tracingChannel('my-channel')
channels.traceSync(
() => {
// Do something
},
{
some: 'thing',
}
)
tracingChannel.tracePromise(fn[, context[, thisArg[, ...args]]])
Ajouté dans : v19.9.0, v18.19.0
[Stable : 1 - Expérimental]
Stable : 1 Stabilité : 1 - Expérimental
fn
<Function> Fonction renvoyant une Promise pour envelopper une tracecontext
<Object> Objet partagé pour corréler les évènements de tracethisArg
<any> Le récepteur à utiliser pour l’appel de la fonction...args
<any> Arguments optionnels à passer à la fonction- Retourne : <Promise> Chaînée à partir de la Promise renvoyée par la fonction donnée
Trace un appel de fonction renvoyant une Promise. Cela produira toujours un évènement start
et un évènement end
autour de la partie synchrone de l’exécution de la fonction, et produira un évènement asyncStart
et un évènement asyncEnd
lorsqu’une continuation de la Promise est atteinte. Cela peut également produire un évènement error
si la fonction donnée lève une erreur ou si la Promise renvoyée est rejetée. Cela exécutera la fonction donnée en utilisant channel.runStores(context, ...)
sur le canal start
ce qui garantit que tous les évènements devraient avoir tous les stockages liés définis pour correspondre à ce contexte de trace.
Pour garantir que seuls des graphes de trace corrects soient formés, les évènements ne seront publiés que si des abonnés sont présents avant le démarrage de la trace. Les abonnements qui sont ajoutés après le début de la trace ne recevront pas les évènements futurs de cette trace, seules les futures traces seront vues.
import diagnostics_channel from 'node:diagnostics_channel'
const channels = diagnostics_channel.tracingChannel('my-channel')
channels.tracePromise(
async () => {
// Do something
},
{
some: 'thing',
}
)
const diagnostics_channel = require('node:diagnostics_channel')
const channels = diagnostics_channel.tracingChannel('my-channel')
channels.tracePromise(
async () => {
// Do something
},
{
some: 'thing',
}
)
tracingChannel.traceCallback(fn[, position[, context[, thisArg[, ...args]]]])
Ajouté dans : v19.9.0, v18.19.0
[Stable: 1 - Expérimental]
Stable: 1 Stabilité: 1 - Expérimental
fn
<Function> fonction de rappel utilisant une fonction pour envelopper une traceposition
<number> Position de l'argument indexé à zéro du rappel attendu (par défaut, le dernier argument siundefined
est passé)context
<Object> Objet partagé pour corréler les événements de trace (par défaut,{}
siundefined
est passé)thisArg
<any> Le récepteur à utiliser pour l'appel de fonction...args
<any> arguments à passer à la fonction (doit inclure le rappel)- Retourne : <any> La valeur de retour de la fonction donnée
Tracer un appel de fonction recevant un rappel. Le rappel est censé suivre la convention d'erreur en tant que premier argument habituellement utilisée. Cela produira toujours un événement start
et un événement end
autour de la portion synchrone de l'exécution de la fonction, et produira un événement asyncStart
et un événement asyncEnd
autour de l'exécution du rappel. Il peut également produire un événement error
si la fonction donnée lève une erreur ou si le premier argument passé au rappel est défini. Cela exécutera la fonction donnée en utilisant channel.runStores(context, ...)
sur le canal start
qui garantit que tous les événements doivent avoir tous les magasins liés définis pour correspondre à ce contexte de trace.
Pour garantir que seuls des graphes de traces corrects sont formés, les événements ne seront publiés que si des abonnés sont présents avant le début de la trace. Les abonnements qui sont ajoutés après le début de la trace ne recevront pas les événements futurs de cette trace, seules les futures traces seront vues.
import diagnostics_channel from 'node:diagnostics_channel'
const channels = diagnostics_channel.tracingChannel('my-channel')
channels.traceCallback(
(arg1, callback) => {
// Do something
callback(null, 'result')
},
1,
{
some: 'thing',
},
thisArg,
arg1,
callback
)
const diagnostics_channel = require('node:diagnostics_channel')
const channels = diagnostics_channel.tracingChannel('my-channel')
channels.traceCallback(
(arg1, callback) => {
// Do something
callback(null, 'result')
},
1,
{
some: 'thing',
},
thisArg,
arg1,
callback
)
Le rappel sera également exécuté avec channel.runStores(context, ...)
ce qui permet la récupération de la perte de contexte dans certains cas.
import diagnostics_channel from 'node:diagnostics_channel'
import { AsyncLocalStorage } from 'node:async_hooks'
const channels = diagnostics_channel.tracingChannel('my-channel')
const myStore = new AsyncLocalStorage()
// Le canal de départ définit les données initiales du magasin sur quelque chose
// et stocke cette valeur de données de magasin sur l'objet de contexte de trace
channels.start.bindStore(myStore, data => {
const span = new Span(data)
data.span = span
return span
})
// Ensuite, asyncStart peut restaurer à partir de ces données qu'il a stockées précédemment
channels.asyncStart.bindStore(myStore, data => {
return data.span
})
const diagnostics_channel = require('node:diagnostics_channel')
const { AsyncLocalStorage } = require('node:async_hooks')
const channels = diagnostics_channel.tracingChannel('my-channel')
const myStore = new AsyncLocalStorage()
// Le canal de départ définit les données initiales du magasin sur quelque chose
// et stocke cette valeur de données de magasin sur l'objet de contexte de trace
channels.start.bindStore(myStore, data => {
const span = new Span(data)
data.span = span
return span
})
// Ensuite, asyncStart peut restaurer à partir de ces données qu'il a stockées précédemment
channels.asyncStart.bindStore(myStore, data => {
return data.span
})
tracingChannel.hasSubscribers
Ajouté dans : v22.0.0, v20.13.0
[Stable : 1 - Expérimental]
Stable : 1 Stabilité : 1 - Expérimental
- Retourne : <boolean>
true
si l’un des canaux individuels a un abonné,false
sinon.
Il s’agit d’une méthode d’assistance disponible sur une instance de TracingChannel
pour vérifier si l’un des canaux TracingChannel a des abonnés. La valeur true
est retournée si l’un d’eux possède au moins un abonné, et la valeur false
est retournée dans le cas contraire.
import diagnostics_channel from 'node:diagnostics_channel'
const channels = diagnostics_channel.tracingChannel('my-channel')
if (channels.hasSubscribers) {
// Faire quelque chose
}
const diagnostics_channel = require('node:diagnostics_channel')
const channels = diagnostics_channel.tracingChannel('my-channel')
if (channels.hasSubscribers) {
// Faire quelque chose
}
Canaux TracingChannel
Un TracingChannel est un ensemble de plusieurs diagnostics_channels représentant des points spécifiques dans le cycle de vie de l’exécution d’une action traçable unique. Le comportement est divisé en cinq diagnostics_channels composés de start
, end
, asyncStart
, asyncEnd
et error
. Une action traçable unique partagera le même objet d’événement entre tous les événements, ce qui peut être utile pour gérer la corrélation via une WeakMap.
Ces objets d’événement seront étendus avec les valeurs result
ou error
lorsque la tâche « se termine ». Dans le cas d’une tâche synchrone, la valeur result
sera la valeur de retour et error
sera tout ce qui est levé par la fonction. Avec les fonctions asynchrones basées sur un rappel, la valeur result
sera le deuxième argument du rappel tandis que la valeur error
sera soit une erreur levée visible dans l’événement end
, soit le premier argument du rappel dans l’un des événements asyncStart
ou asyncEnd
.
Pour garantir que seuls les graphiques de trace corrects soient formés, les événements ne doivent être publiés que si des abonnés sont présents avant de commencer la trace. Les abonnements qui sont ajoutés après le début de la trace ne devraient pas recevoir d’événements futurs de cette trace ; seules les traces futures seront visibles.
Les canaux de traçage doivent suivre un modèle de nommage de :
tracing:module.class.method:start
outracing:module.function:start
tracing:module.class.method:end
outracing:module.function:end
tracing:module.class.method:asyncStart
outracing:module.function:asyncStart
tracing:module.class.method:asyncEnd
outracing:module.function:asyncEnd
tracing:module.class.method:error
outracing:module.function:error
start(event)
- Nom :
tracing:${name}:start
L’événement start
représente le point auquel une fonction est appelée. À ce point, les données de l’événement peuvent contenir les arguments de la fonction ou tout autre élément disponible au tout début de l’exécution de la fonction.
end(event)
- Nom :
tracing:${name}:end
L’événement end
représente le point auquel un appel de fonction renvoie une valeur. Dans le cas d’une fonction asynchrone, il s’agit du moment où la promesse est renvoyée et non du moment où la fonction elle-même effectue une instruction de retour en interne. À ce point, si la fonction tracée était synchrone, le champ result
sera défini sur la valeur de retour de la fonction. En outre, le champ error
peut être présent pour représenter toute erreur levée.
Il est recommandé d’écouter spécifiquement l’événement error
pour suivre les erreurs, car il est possible qu’une action traçable produise plusieurs erreurs. Par exemple, une tâche asynchrone qui échoue peut être démarrée en interne avant que la partie synchrone de la tâche ne lève une erreur.
asyncStart(event)
- Nom :
tracing:${name}:asyncStart
L’événement asyncStart
représente le rappel ou la continuation d’une fonction traçable en cours d’atteinte. À ce point, des éléments tels que les arguments de rappel peuvent être disponibles, ou tout autre élément exprimant le « résultat » de l’action.
Pour les fonctions basées sur les rappels, le premier argument du rappel sera attribué au champ error
, s’il n’est pas undefined
ou null
, et le deuxième argument sera attribué au champ result
.
Pour les promesses, l’argument du chemin resolve
sera attribué à result
ou l’argument du chemin reject
sera attribué à error
.
Il est recommandé d’écouter spécifiquement l’événement error
pour suivre les erreurs, car il est possible qu’une action traçable produise plusieurs erreurs. Par exemple, une tâche asynchrone qui échoue peut être démarrée en interne avant que la partie synchrone de la tâche ne lève une erreur.
asyncEnd(event)
- Nom :
tracing:${name}:asyncEnd
L’événement asyncEnd
représente le rappel d’une fonction asynchrone en cours de renvoi. Il est peu probable que les données d’événement changent après l’événement asyncStart
. Cependant, il peut être utile de voir le point où le rappel se termine.
error(event)
- Nom :
tracing:${name}:error
L’événement error
représente toute erreur produite par la fonction traçable, que ce soit de manière synchrone ou asynchrone. Si une erreur est levée dans la partie synchrone de la fonction tracée, l’erreur sera attribuée au champ error
de l’événement et l’événement error
sera déclenché. Si une erreur est reçue de manière asynchrone via un rappel ou un rejet de promesse, elle sera également attribuée au champ error
de l’événement et déclenchera l’événement error
.
Il est possible qu’un seul appel de fonction traçable produise des erreurs à plusieurs reprises ; il faut donc en tenir compte lors de la consommation de cet événement. Par exemple, si une autre tâche asynchrone est déclenchée en interne, qui échoue, puis que la partie synchrone de la fonction lève une erreur, deux événements error
seront émis, un pour l’erreur synchrone et un pour l’erreur asynchrone.
Canaux intégrés
[Stable : 1 - Expérimental]
Stable : 1 Stabilité : 1 - Expérimental
Bien que l’API diagnostics_channel soit désormais considérée comme stable, les canaux intégrés actuellement disponibles ne le sont pas. Chaque canal doit être déclaré stable indépendamment.
HTTP
http.client.request.created
request
<http.ClientRequest>
Émis lorsqu’un client crée un objet de requête. Contrairement à http.client.request.start
, cet événement est émis avant que la requête n’ait été envoyée.
http.client.request.start
request
<http.ClientRequest>
Émis lorsqu’un client démarre une requête.
http.client.request.error
request
<http.ClientRequest>error
<Error>
Émis lorsqu’une erreur se produit lors d’une requête client.
http.client.response.finish
request
<http.ClientRequest>response
<http.IncomingMessage>
Émis lorsqu’un client reçoit une réponse.
http.server.request.start
request
<http.IncomingMessage>response
<http.ServerResponse>socket
<net.Socket>server
<http.Server>
Émis lorsqu’un serveur reçoit une requête.
http.server.response.created
request
<http.IncomingMessage>response
<http.ServerResponse>
Émis lorsqu’un serveur crée une réponse. L’événement est émis avant que la réponse ne soit envoyée.
http.server.response.finish
request
<http.IncomingMessage>response
<http.ServerResponse>socket
<net.Socket>server
<http.Server>
Émis lorsqu’un serveur envoie une réponse.
Modules
module.require.start
event
<Object> contenant les propriétés suivantes :id
- Argument passé àrequire()
. Nom du module.parentFilename
- Nom du module qui a tenté de fairerequire(id)
.
Émis lorsque require()
est exécuté. Voir l'événement start
.
module.require.end
event
<Object> contenant les propriétés suivantes :id
- Argument passé àrequire()
. Nom du module.parentFilename
- Nom du module qui a tenté de fairerequire(id)
.
Émis lorsqu'un appel à require()
renvoie une valeur. Voir l'événement end
.
module.require.error
event
<Object> contenant les propriétés suivantes :id
- Argument passé àrequire()
. Nom du module.parentFilename
- Nom du module qui a tenté de fairerequire(id)
.
error
<Error>
Émis lorsqu'un require()
lève une erreur. Voir l'événement error
.
module.import.asyncStart
event
<Object> contenant les propriétés suivantes :id
- Argument passé àimport()
. Nom du module.parentURL
- Objet URL du module qui a tenté de faireimport(id)
.
Émis lorsque import()
est invoqué. Voir l'événement asyncStart
.
module.import.asyncEnd
event
<Object> contenant les propriétés suivantes :id
- Argument passé àimport()
. Nom du module.parentURL
- Objet URL du module qui a tenté de faireimport(id)
.
Émis lorsque import()
est terminé. Voir l'événement asyncEnd
.
module.import.error
event
<Object> contenant les propriétés suivantes :id
- Argument passé àimport()
. Nom du module.parentURL
- Objet URL du module qui a tenté de faireimport(id)
.
error
<Error>
Émis lorsqu'un import()
lève une erreur. Voir l'événement error
.
NET
net.client.socket
socket
<net.Socket>
Émis lorsqu'un nouveau socket client TCP ou pipe est créé.
net.server.socket
socket
<net.Socket>
Émis lorsqu'une nouvelle connexion TCP ou pipe est reçue.
tracing:net.server.listen:asyncStart
server
<net.Server>options
<Object>
Émis lorsque net.Server.listen()
est invoqué, avant que le port ou le pipe ne soit réellement configuré.
tracing:net.server.listen:asyncEnd
server
<net.Server>
Émis lorsque net.Server.listen()
est terminé et que le serveur est donc prêt à accepter les connexions.
tracing:net.server.listen:error
server
<net.Server>error
<Error>
Émis lorsque net.Server.listen()
renvoie une erreur.
UDP
udp.socket
socket
<dgram.Socket>
Émis lorsqu'un nouveau socket UDP est créé.
Processus
Ajouté dans : v16.18.0
child_process
process
<ChildProcess>
Émis lorsqu'un nouveau processus est créé.
Thread Worker
Ajouté dans : v16.18.0
worker_threads
worker
Worker
Émis lorsqu'un nouveau thread est créé.