
Cliente de estatísticas UDP/TCP minimalista e sem dependência para Node.js
Há momentos em que você precisa coletar métricas e deseja algo simples, sem escrever muitos clichês, dats para ajudá-lo!
Este cliente pretende ter uma API simples compatível com statsd com algum tipo opcional para uso avançado, como: métricas em buffer e transportes UDP/TCP!
Suporta Node.js >=14.0.0 , se você for um usuário do Node.js v12 consulte [email protected] .
Clientnew 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)O pacote está disponível em npm.
Você pode instalá-lo com 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 ) ; Se o nome do host contiver algum arquivo . , o cliente os substituirá por _ .
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:
ClientClientO cliente statsd
new Client(options)options : objeto de configuração.host : statsd host ( udp://{ip}:{port} ou tcp://{ip}:{port} ), você também pode usar ipv6. Se você deseja forçar o uso do udp6: udp6://{host}:{port} , ao usar TCP, você deve chamar o método Client.connect .namespace : opcional. Prefixo a ser usado para as métricas. A métrica será enviada como namespace. + a string métrica. Opcionalmente, você pode usar os espaços reservados ${hostname} e ${pid} no namespace e substituí-los pelo nome do host da máquina e pelo ID do processo.bufferSize : Opcional. O padrão é 0 . Definir este valor para um número maior que zero ativará o modo buffer, que em vez de enviar métricas em cada chamada, irá armazená-las e enviá-las quando ocorrer uma destas condições: o buffer está cheio ou o bufferFlushTimeout expirou. Usar essa abordagem tem melhor desempenho, mas você deve ter cuidado ao usar um valor compatível com o MTU disponível em sua rede, caso contrário, seus pacotes poderão ser descartados silenciosamente. Consulte pacotes multimétricos.bufferFlushTimeout : opcional. O padrão é 100 . Tempo limite em milissegundos para esperar antes de liberar o buffer de métricas.debug : opcional. debuglog('dats') . A função de registrador.udpDnsCache : Opcional. Padrão verdadeiro. Ative a pesquisa DNS do cache para udp.udpDnsCacheTTL : Opcional. Padrão 120 . Cache DNS Tempo de vida em segundos.onError : Opcional. Padrão (err) => void . Chamado quando há um erro. Permite verificar também erros de envio.customSocket : Opcional. Padrão null . Soquete customizado utilizado pelo cliente, este é um recurso para mock não recomendamos seu uso em produção.tags : Opcional Padrão null . Se fornecidas, as métricas incluirão tags no formato #key1:value1,key2:value2 . Client.close([cb])feche o soquete do cliente
cb : opcional. Uma função de retorno de chamada a ser chamada quando o soquete estiver fechado. Se nenhum cb for fornecido, uma Promise será retornada. Retorna : uma Promise se nenhum cb for aprovado.
Client.connect()conecte o soquete TCP. Chamar esta função é necessário apenas em TCP.
Retorno : uma Promise .
Client.counter(string[, value, sampling])envie uma métrica do tipo contador
string : a string métricavalue : opcional. O valor da métrica ( Number ). O padrão é 1 .sampling : Opcional. A amostragem métrica. Todos os erros de envio são tratados pelo retorno de chamada onError .
Client.timing(string, value[, sampling])envie uma métrica do tipo timing
string : a string métricavalue : o valor da métrica ( Number ).sampling : Opcional. A amostragem métrica. Todos os erros de envio são tratados pelo retorno de chamada onError .
Client.gauge(string, value)envie uma métrica do tipo medidor
string : a string métricavalue : o valor da métrica ( Number ). Todos os erros de envio são tratados pelo retorno de chamada onError .
Client.set(string, value)envie uma métrica do tipo set
string : a string métricavalue : O valor da métrica ( Number ). Todos os erros de envio são tratados pelo retorno de chamada onError .
Dats exporta seu mock, você pode usá-lo da seguinte maneira:
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 também é exposto como uma CLI que pode ser instalada como um pacote global npm ou um binário pré-compilado.
O binário pré-compilado pode ser encontrado na seção de lançamento para 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` Cada sinalizador de comando também pode ser especificado no formato JSON no arquivo .datsrc , o processo em tempo de execução irá pesquisá-lo no diretório de trabalho atual e mesclar a configuração e os sinalizadores do arquivo antes de executar!
{
"host" : " 123.123.123.123 " ,
"port" : " 1234 " ,
"prefix" : " my_metric_prefix "
}Se você quiser usar o binário pré-compilado, obtenha o link correto para o seu sistema operacional na seção de lançamento e faça o seguinte:
curl https://github.com/immobiliare/dats/releases/download/v{{VERSION_TAG}}/dats-cli-{{VERSION_OS}} -L -o dats-cli
chmod +x dats-cli
./dats-cliO benchmarking automático para cada commit pode ser encontrado nos seguintes links: next e main.
Os testes foram feitos utilizando autocannon apontando para um servidor HTTP node.js que envia a cada solicitação uma métrica de contagem. Com esse tipo de teste avaliamos o quanto a biblioteca influencia no desempenho da aplicação.
Abaixo estão relatados os benchmarks com os clientes statsd node.js mais famosos:
| BIBLIOTECA | Necessidade/seg (97,5º) | Necessidade/seg (média) |
|---|---|---|
| dados | 45503 | 43174.4 |
| tiros quentes | 46975 | 43319,47 |
| estatísticas do nó | 14935 | 11632,34 |
| cliente-statsd | 42463 | 35790,67 |
| Base | 50271 | 43312,54 |
Base é o servidor HTTP sem métricas.
dats foi criado pela incrível equipe Node.js da ImmobiliareLabs, o departamento de tecnologia da Immobiliare.it, a empresa imobiliária número 1 na Itália.
Atualmente, estamos usando dados em nossos produtos, bem como em nossas ferramentas internas.
Se você estiver usando dats em produção, envie-nos uma mensagem .
Feito com ❤️ por ImmobiliareLabs & Contributors
Adoraríamos que você contribuísse para o dats! Se você tiver alguma dúvida sobre como usar dats, bugs e melhorias, sinta-se à vontade para entrar em contato abrindo um problema no GitHub.
dats é licenciado sob a licença do MIT. Consulte o arquivo LICENSE para obter mais informações.