Cliente de estadísticas UDP/TCP minimalista y sin dependencias para Node.js
Hay momentos en los que tienes que recopilar métricas y quieres algo simple sin escribir demasiado texto repetitivo, dats
en tu ayuda!
Este cliente pretende tener una API simple compatible con statsd con alguna versión opcional para uso avanzado, como: métricas almacenadas en búfer y transportes UDP/TCP.
Admite Node.js >=14.0.0
, si es usuario de Node.js v12
consulte [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)
El paquete está disponible en npm.
Puedes instalarlo con npm
# lastest stable version
$ npm i -S @immobiliarelabs/dats
# latest development version
$ npm i -S @immobiliarelabs/dats@next
o 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 el nombre de host contiene algún archivo .
, el cliente los reemplazará con _
.
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 ) ;
Este módulo exporta:
Client
Client
El cliente de estadísticas
new Client(options)
options
: objeto de configuración.host
: statsd host ( udp://{ip}:{port}
o tcp://{ip}:{port}
), también puedes usar ipv6. Si desea forzar el uso de udp6: udp6://{host}:{port}
, cuando use TCP, debe llamar al método Client.connect
.namespace
: opcional. Prefijo que se utilizará para las métricas. La métrica se enviará como namespace.
+ la cadena métrica. Opcionalmente, puede utilizar los marcadores de posición ${hostname}
y ${pid}
en el espacio de nombres y sustituirlos por el nombre de host de la máquina y la identificación del proceso.bufferSize
: Opcional. El valor predeterminado es 0
. Establecer este valor en un número mayor que cero activará el modo almacenado en búfer, que en lugar de enviar métricas en cada llamada, las almacenará en búfer y las enviará cuando ocurra una de estas condiciones: el búfer está lleno o el bufferFlushTimeout
ha expirado. Usar este enfoque tiene más rendimiento, pero debe tener cuidado de utilizar un valor compatible con la MTU disponible en su red; de lo contrario, sus paquetes podrían descartarse silenciosamente. Ver paquetes multimétricos.bufferFlushTimeout
: Opcional. El valor predeterminado es 100
. Tiempo de espera en milisegundos para esperar antes de vaciar el búfer de métricas.debug
: opcional. debuglog('dats')
predeterminado. La función de registrador.udpDnsCache
: Opcional. Por defecto es verdadero. Active la búsqueda de DNS en caché para udp.udpDnsCacheTTL
: Opcional. Predeterminado 120
. Caché DNS Tiempo de vida en segundos.onError
: Opcional. Predeterminado (err) => void
. Se llama cuando hay un error. Le permite comprobar también los errores de envío.customSocket
: Opcional. null
predeterminado. Socket personalizado utilizado por el cliente, esta es una característica para burlarse, no recomendamos usarla en producción.tags
: Opcional Predeterminado null
. Si se proporcionan, las métricas incluirán etiquetas con el formato #key1:value1,key2:value2
. Client.close([cb])
cerrar el socket del cliente
cb
: opcional. Una función de devolución de llamada para llamar cuando el socket está cerrado. Si no se proporciona cb
, se devuelve una Promise
. Devuelve : una Promise
si no se pasa ningún cb
.
Client.connect()
Conecte el conector TCP. Llamar a esta función solo es necesario en TCP.
Devoluciones : una Promise
.
Client.counter(string[, value, sampling])
enviar una métrica de tipo contador
string
: la cadena métricavalue
: Opcional. El valor de la métrica ( Number
). El valor predeterminado es 1
.sampling
: Opcional. El muestreo métrico. Todos los errores de envío son manejados por la devolución de llamada onError
.
Client.timing(string, value[, sampling])
enviar una métrica de tipo timing
string
: la cadena métricavalue
: El valor de la métrica ( Number
).sampling
: Opcional. El muestreo métrico. Todos los errores de envío son manejados por la devolución de llamada onError
.
Client.gauge(string, value)
enviar una métrica de tipo calibre
string
: la cadena métricavalue
: El valor de la métrica ( Number
). Todos los errores de envío son manejados por la devolución de llamada onError
.
Client.set(string, value)
enviar una métrica de tipo conjunto
string
: la cadena métricavalue
: El valor de la métrica ( Number
). Todos los errores de envío son manejados por la devolución de llamada onError
.
Dats exporta su simulacro, puedes usarlo de la siguiente manera:
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 también se expone como una CLI que puede instalarse como un paquete global npm o como un binario precompilado.
El binario precompilado se puede encontrar en la sección de lanzamiento para Linux, MacOS o 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`
Cada indicador de comando también se puede especificar en formato JSON en el archivo .datsrc
, el proceso en tiempo de ejecución lo buscará en el directorio de trabajo actual y fusionará tanto el archivo de configuración como los indicadores antes de ejecutarlo.
{
"host" : " 123.123.123.123 " ,
"port" : " 1234 " ,
"prefix" : " my_metric_prefix "
}
Si desea utilizar el binario precompilado, obtenga el enlace correcto para su sistema operativo en la sección de lanzamiento y haga lo siguiente:
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
La evaluación comparativa automática para cada confirmación se puede encontrar en los siguientes enlaces: siguiente y principal.
Las pruebas se realizaron utilizando un cañón automático que apunta a un servidor HTTP node.js que envía en cada solicitud una métrica de recuento. Con este tipo de prueba, evaluamos cuánto influye la biblioteca en el rendimiento de la aplicación.
A continuación se muestran los puntos de referencia con los clientes de estadísticas de node.js más famosos:
BIBLIOTECA | Solicitud/seg (97,5.º) | Solicitud/seg (promedio) |
---|---|---|
datos | 45503 | 43174.4 |
tiros calientes | 46975 | 43319.47 |
estadísticas de nodo | 14935 | 11632.34 |
cliente-statsd | 42463 | 35790.67 |
Base | 50271 | 43312.54 |
La base es el servidor HTTP sin métricas.
dats fue creado por el increíble equipo de Node.js de ImmobiliareLabs, el departamento tecnológico de Immobiliare.it, la empresa inmobiliaria número uno en Italia.
Actualmente utilizamos datos en nuestros productos, así como en nuestras herramientas internas.
Si está utilizando datos en producción, envíenos un mensaje .
Hecho con ❤️ por ImmobiliareLabs y colaboradores
¡Nos encantaría que contribuyeras a las citas! Si tiene alguna pregunta sobre cómo usar datos, errores y mejoras, no dude en comunicarse abriendo una edición de GitHub.
dats tiene la licencia MIT. Consulte el archivo de LICENCIA para obtener más información.