Client de statistiques UDP/TCP minimaliste sans dépendances pour Node.js
Il y a des moments où vous devez rassembler des métriques et vous voulez quelque chose de simple sans écrire trop de passe-partout, dats
à votre aide !
Ce client vise à disposer d'une API simple conforme à statsd avec des options facultatives pour une utilisation avancée, comme : des métriques mises en mémoire tampon et des transports UDP/TCP !
Prend en charge Node.js >=14.0.0
, si vous êtes un utilisateur Node.js v12
reportez-vous à [email protected]
.
Client
new Client(options)
Client.close([cb])
Client.connect()
Client.counter(string[, value, sampling])
Client.timing(string, value[, sampling])
Client.gauge(string, value)
Client.set(string, value)
Le package est disponible sur npm.
Vous pouvez l'installer avec npm
# lastest stable version
$ npm i -S @immobiliarelabs/dats
# latest development version
$ npm i -S @immobiliarelabs/dats@next
ou yarn
# lastest stable version
$ yarn add @immobiliarelabs/dats
# latest development version
$ yarn @immobiliarelabs/dats@next
import Client from '@immobiliarelabs/dats' ;
const stats = new Client ( {
host : 'udp://someip:someport' ,
namespace : 'myGrafanaNamespace' ,
// Optionally register a global handler to track errors.
onError : ( error ) => {
processError ( error ) ;
} ,
} ) ;
// Send counter (myGrafanaNamespace.some.toCount)
stats . counter ( 'some.toCount' , 3 ) ;
stats . counter ( 'some.toCount' ) ; // defaults to 1
stats . counter ( 'some.toCount' , 1 , 10 ) ; // set sampling to 10
// Send timing (myGrafanaNamespace.some.toTime)
stats . timing ( 'some.toTime' , 10 ) ;
stats . timing ( 'some.toTime' , 10 , 0.1 ) ; // set sampling to 0.1
// Send gauge (myGrafanaNamespace.some.toGauge)
stats . gauge ( 'some.toGauge' , 23 ) ;
// Send set (myGrafanaNamespace.some.set)
stats . set ( 'some.set' , 765 ) ;
// Scope your stats per hostname and/or pid
import Client from '@immobiliarelabs/dats' ;
const stats = new Client ( {
host : 'udp://someip:someport' ,
namespace : 'myGrafanaNamespace.${hostname}.${pid}' ,
} ) ;
// Send counter (myGrafanaNamespace.myMachine.123.some.toCount)
stats . counter ( 'some.toCount' , 3 ) ;
Si le nom d'hôte contient des fichiers .
, le client les remplacera par _
.
import Client from '@immobiliarelabs/dats' ;
// TCP usage
const stats = new Client ( {
host : 'tcp://someip:someport' ,
namespace : 'myGrafanaNamespace.${hostname}.${pid}' ,
} ) ;
// Calling connect is required in TCP environment
await stats . connect ( ) ;
// Send counter (myGrafanaNamespace.myMachine.123.some.toCount)
stats . counter ( 'some.toCount' , 3 ) ;
Ce module exporte :
Client
Client
Le client statistiques
new Client(options)
options
: objet de configuration.host
: statsd host ( udp://{ip}:{port}
ou tcp://{ip}:{port}
), vous pouvez également utiliser ipv6. Si vous souhaitez forcer l'utilisation de udp6, utilisez : udp6://{host}:{port}
, lorsque vous utilisez TCP, vous devez appeler la méthode Client.connect
.namespace
: facultatif. Préfixe à utiliser pour les métriques. La métrique sera envoyée sous forme namespace.
+ la chaîne métrique. Vous pouvez éventuellement utiliser des espaces réservés ${hostname}
et ${pid}
dans l'espace de noms et les remplacer par le nom d'hôte de la machine et l'ID du processus.bufferSize
: Facultatif. La valeur par défaut est 0
. Définir cette valeur sur un nombre supérieur à zéro activera le mode tamponné qui, au lieu d'envoyer des métriques à chaque appel, les mettra en tampon et les enverra lorsque l'une de ces conditions se produit : le tampon est plein ou le bufferFlushTimeout
a expiré. Utiliser cette approche est plus performante, mais vous devez faire attention à utiliser une valeur compatible avec la MTU disponible sur votre réseau, sinon vos paquets pourraient être abandonnés silencieusement. Voir paquets multi-métriques.bufferFlushTimeout
: facultatif. La valeur par défaut est 100
. Délai d'attente en millisecondes avant de vider le tampon des métriques.debug
: facultatif. debuglog('dats')
par défaut. La fonction enregistreur.udpDnsCache
: facultatif. Vrai par défaut. Activez la recherche DNS du cache pour udp.udpDnsCacheTTL
: facultatif. Par défaut 120
. Cache DNS Durée de vie en secondes.onError
: facultatif. Par défaut (err) => void
. Appelé en cas d'erreur. Vous permet de vérifier également les erreurs d'envoi.customSocket
: facultatif. null
par défaut. Socket personnalisé utilisé par le client, il s'agit d'une fonctionnalité de moquerie que nous déconseillons de l'utiliser en production.tags
: facultatif, valeur null
par défaut. Si elles sont fournies, les métriques incluront des balises au format #key1:value1,key2:value2
. Client.close([cb])
fermez le socket client
cb
: facultatif. Une fonction de rappel à appeler lorsque le socket est fermé. Si aucune cb
n’est fournie, une Promise
est retournée. Renvoie : une Promise
si aucun cb
n'est passé.
Client.connect()
connectez le socket TCP. L'appel de cette fonction n'est requis que sur TCP.
Retours : une Promise
.
Client.counter(string[, value, sampling])
envoyer une métrique de type compteur
string
: La chaîne métriquevalue
: Facultatif. La valeur métrique ( Number
). La valeur par défaut est 1
.sampling
: Facultatif. L'échantillonnage métrique. Toutes les erreurs d'envoi sont gérées par le rappel onError
.
Client.timing(string, value[, sampling])
envoyer une métrique de type timing
string
: La chaîne métriquevalue
: La valeur métrique ( Number
).sampling
: Facultatif. L'échantillonnage métrique. Toutes les erreurs d'envoi sont gérées par le rappel onError
.
Client.gauge(string, value)
envoyer une métrique de type jauge
string
: La chaîne métriquevalue
: La valeur métrique ( Number
). Toutes les erreurs d'envoi sont gérées par le rappel onError
.
Client.set(string, value)
envoyer une métrique de type set
string
: La chaîne métriquevalue
: La valeur métrique ( Number
). Toutes les erreurs d'envoi sont gérées par le rappel onError
.
Dats exporte sa maquette, vous pouvez l'utiliser comme suit :
import ClientMock from '@immobiliarelabs/dats/dist/mock' ;
const host = new URL ( `udp://127.0.0.1:8232` ) ;
const namespace = 'ns1' ;
const client = new ClientMock ( { host , namespace } ) ;
client . gauge ( 'some.metric' , 100 ) ;
client . set ( 'some.metric' , 100 ) ;
// metrics is an array with all metrics sent
console . log ( client . metrics ) ;
/* stdout:
[
'ns1.some.metric:100|g',
'ns1.some.metric:100|s',
]
*/
// Check if a metric is in the metrics array
client . hasSent ( 'ns1.some.metric:100|s' ) ; // -> true
client . hasSent ( 'ns1.some.metric:10|s' ) ; // -> false
client . hasSent ( / ns1.some.metric:d+|s / ) ; // -> true
client . hasSent ( / ns1.some.test:d+|s / ) ; // -> false
// Clean the metrics array with
client . cleanMetrics ( ) ;
console . log ( client . metrics ) ;
/* stdout:
[]
*/
dats est également exposé en tant que CLI qui peut être installé à la fois en tant que package global npm ou en tant que binaire précompilé.
Le binaire de précompilation se trouve dans la section des versions pour Linux, MacOS ou Windows.
$ npm i -g @immobiliarelabs/dats
dats --help
# The following are required input flags:
#
# --host {string} []
# --port {string} []
# --type {string} [Metric type can be one of: counter, timing, gauge, set]
# --prefix {string} [Metric prefix]
# --namespace {string} [Metric full namespace, use dots `.` to separate metrics]
# --value {string} [Metric value]
# --quiet {boolean} [Suppress all console output]
# --dryRun {boolean} [Metric wont be sent, use for debug]
#
# If unsure of output run the command prepended with `DRY_RUN=1`
Chaque indicateur de commande peut également être spécifié au format JSON dans le fichier .datsrc
, le processus au moment de l'exécution le recherchera dans le répertoire de travail actuel et fusionnera à la fois la configuration du fichier et les indicateurs avant de s'exécuter !
{
"host" : " 123.123.123.123 " ,
"port" : " 1234 " ,
"prefix" : " my_metric_prefix "
}
Si vous souhaitez utiliser le binaire précompilé, obtenez le lien correct pour votre système d'exploitation dans la section des versions et procédez comme suit :
curl https://github.com/immobiliare/dats/releases/download/v{{VERSION_TAG}}/dats-cli-{{VERSION_OS}} -L -o dats-cli
chmod +x dats-cli
./dats-cli
L'analyse comparative automatique pour chaque commit peut être trouvée sur les liens suivants : next et main.
Les tests ont été effectués à l'aide d'un canon automatique pointant vers un serveur HTTP node.js qui envoie à chaque requête une métrique de comptage. Avec ce genre de test, nous évaluons à quel point la bibliothèque influence les performances de l'application.
Vous trouverez ci-dessous les benchmarks avec les clients node.js statsd les plus connus :
BIBLIOTHÈQUE | Requête/Sec (97,5ème) | Req/Sec (moy.) |
---|---|---|
dates | 45503 | 43174.4 |
coups chauds | 46975 | 43319.47 |
nœud-statistiques | 14935 | 11632.34 |
client statsd | 42463 | 35790.67 |
Base | 50271 | 43312.54 |
Base est le serveur HTTP sans métriques.
dats a été créé par l'incroyable équipe Node.js d'ImmobiliareLabs, le département technique d'Immobiliare.it, la société immobilière n°1 en Italie.
Nous utilisons actuellement des données dans nos produits ainsi que dans nos outils internes.
Si vous utilisez des données en production, envoyez-nous un message .
Réalisé avec ❤️ par ImmobiliareLabs & Contributeurs
Nous serions ravis que vous contribuiez à dats ! Si vous avez des questions sur l'utilisation des données, des bugs et des améliorations, n'hésitez pas à nous contacter en ouvrant un problème GitHub.
dats est sous licence MIT. Voir le fichier LICENSE pour plus d'informations.