
Минималистичный клиент статистики UDP/TCP с нулевой зависимостью для Node.js
Бывают случаи, когда вам нужно собрать показатели, и вам нужно что-то простое, не написав слишком много шаблонов, dats вам на помощь!
Этот клиент стремится иметь простой API-интерфейс, совместимый со statsd, с некоторыми дополнительными вариантами для расширенного использования, например: буферизованные метрики и транспорты UDP/TCP!
Поддерживает Node.js >=14.0.0 . Если вы являетесь пользователем Node.js v12 обратитесь к [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)Пакет доступен на npm.
Вы можете установить его с помощью npm
# lastest stable version
$ npm i -S @immobiliarelabs/dats
# latest development version
$ npm i -S @immobiliarelabs/dats@next или 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 ) ; Если имя хоста содержит какие-либо файлы . , клиент заменит их на _ .
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 ) ; Этот модуль экспортирует:
ClientClientКлиент статистики
new Client(options)options : объект конфигурации.host : хост статистики ( udp://{ip}:{port} или tcp://{ip}:{port} ), вы также можете использовать ipv6. Если вы хотите принудительно использовать udp6, используйте: udp6://{host}:{port} , при использовании TCP вам необходимо вызвать метод Client.connect .namespace : необязательно. Префикс, используемый для метрик. Метрика будет отправлена как namespace. + метрическая строка. При желании вы можете использовать заполнители ${hostname} и ${pid} в пространстве имен и заменить их именем хоста компьютера и идентификатором процесса.bufferSize : необязательно. По умолчанию — 0 . Установка этого значения на число больше нуля активирует режим буферизации, в котором вместо отправки метрик при каждом вызове они будут буферизоваться и отправляться при возникновении одного из следующих условий: буфер заполнен или истек срок действия bufferFlushTimeout . Использование этого подхода более производительно, но вы должны быть осторожны и использовать значение, совместимое с MTU, доступным в вашей сети, иначе ваши пакеты могут быть отброшены без уведомления. См. мультиметрические пакеты.bufferFlushTimeout : необязательно. По умолчанию — 100 . Тайм-аут в миллисекундах перед очисткой буфера метрик.debug : необязательно. debuglog('dats') . Функция логгера.udpDnsCache : необязательно. По умолчанию правда. Активируйте поиск кэша DNS для udp.udpDnsCacheTTL : необязательно. По умолчанию 120 . DNS-кеш Время жизни в секундах.onError : Необязательно. По умолчанию (err) => void . Вызывается при возникновении ошибки. Позволяет проверять и отправлять ошибки.customSocket : необязательно. По умолчанию null . Пользовательский сокет, используемый клиентом. Это функция для насмешки. Мы не рекомендуем использовать ее в рабочей среде.tags : Необязательно. Значение по умолчанию — null . Если это предусмотрено, метрики будут включать теги в форме #key1:value1,key2:value2 . Client.close([cb])закрыть клиентский сокет
cb : необязательно. Функция обратного вызова, вызываемая при закрытии сокета. Если cb не указан, возвращается Promise . Возвращает : Promise , если cb не передано.
Client.connect()подключите TCP-сокет. Вызов этой функции требуется только по TCP.
Возвращает : Promise .
Client.counter(string[, value, sampling])отправить метрику типа счетчика
string : метрическая строкаvalue : Необязательно. Значение метрики ( Number ). По умолчанию 1 .sampling : Необязательно. Метрическая выборка. Все ошибки отправки обрабатываются обратным вызовом onError .
Client.timing(string, value[, sampling])отправить метрику времени типа
string : метрическая строкаvalue : значение метрики ( Number ).sampling : Необязательно. Метрическая выборка. Все ошибки отправки обрабатываются обратным вызовом onError .
Client.gauge(string, value)отправить метрику типа манометра
string : метрическая строкаvalue : значение метрики ( Number ). Все ошибки отправки обрабатываются обратным вызовом onError .
Client.set(string, value)отправить метрику набора типов
string : метрическая строкаvalue : значение метрики ( Number ). Все ошибки отправки обрабатываются обратным вызовом onError .
Датс экспортирует свой макет, вы можете использовать его следующим образом:
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 также предоставляется как CLI, который можно установить как глобальный пакет npm, так и предварительно скомпилированный двоичный файл.
Бинарный файл прекомпиляции можно найти в разделе релизов для Linux, MacOS или 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` Каждый флаг команды также можно указать в формате JSON в файле .datsrc , процесс во время выполнения будет искать его в текущем рабочем каталоге и объединять конфигурацию файла и флаги перед запуском!
{
"host" : " 123.123.123.123 " ,
"port" : " 1234 " ,
"prefix" : " my_metric_prefix "
}Если вы хотите использовать предварительно скомпилированный двоичный файл, получите правильную ссылку для вашей ОС в разделе выпуска и выполните следующие действия:
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Автоматический тест для каждого коммита можно найти по следующим ссылкам: next и main.
Тесты проводились с использованием autocannon, указывающего на HTTP-сервер node.js, который отправляет при каждом запросе метрику счетчика. С помощью такого теста мы оцениваем, насколько библиотека влияет на производительность приложения.
Ниже приведены тесты с наиболее известными клиентами node.js statsd:
| БИБЛИОТЕКА | Запрос/сек (97,5-й) | Запрос/сек (в среднем) |
|---|---|---|
| дата | 45503 | 43174.4 |
| горячие шишки | 46975 | 43319.47 |
| узел-statsd | 14935 | 11632,34 |
| statsd-клиент | 42463 | 35790,67 |
| База | 50271 | 43312.54 |
База — это HTTP-сервер без метрик.
dats был создан замечательной командой Node.js из ImmobiliareLabs, технического отдела Immobiliare.it, компании по недвижимости №1 в Италии.
В настоящее время мы используем данные в наших продуктах, а также во внутренних инструментах.
Если вы используете Dats в производстве, напишите нам сообщение .
Сделано с ❤️ авторами ImmobiliareLabs и участниками
Мы будем рады, если вы внесете свой вклад в развитие дат! Если у вас есть вопросы о том, как использовать данные, ошибки и улучшения, задайте их, открыв выпуск на GitHub.
dats лицензируется по лицензии MIT. Дополнительную информацию смотрите в файле LICENSE.