Node.js 的簡約零依賴 UDP/TCP statsd 用戶端
有時,您必須收集指標,並且想要一些簡單的東西,而不需要編寫太多樣板文件, dats
對您有幫助!
這個客戶端的目標是擁有一個簡單的、符合 statsd 的 API,並具有一些可供進階使用的可選風格,例如:緩衝指標和 UDP/TCP 傳輸!
支援 Node.js >=14.0.0
,如果您是 Node.js v12
用戶,請參閱[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)
該軟體包可在 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 ) ;
此模組導出:
Client
Client
統計客戶端
new Client(options)
options
:配置物件。host
: statsd 主機( udp://{ip}:{port}
或tcp://{ip}:{port}
),您也可以使用 ipv6。如果你想強制使用 udp6 使用: udp6://{host}:{port}
,當使用 TCP 時,你必須呼叫Client.connect
方法。namespace
:可選。用於指標的前綴。此指標將作為namespace.
+ 公製字串。您可以選擇在命名空間中使用${hostname}
和${pid}
佔位符,並將它們替換為電腦主機名稱和進程 ID。bufferSize
:可選。預設值為0
。將此值設為大於零的數字將啟動緩衝模式,該模式不是在每次呼叫時發送指標,而是緩衝它們並在發生以下條件之一時發送它們:緩衝區已滿或bufferFlushTimeout
已過期。使用此方法的效能更高,但您必須小心使用與網路上可用的 MTU 相容的值,否則您的封包可能會被悄悄丟棄。請參閱多度量資料包。bufferFlushTimeout
:可選。預設值為100
。刷新指標緩衝區之前等待的逾時(以毫秒為單位)。debug
:可選。預設debuglog('dats')
。記錄器功能。udpDnsCache
:可選。預設為真。啟動 udp 的快取 DNS 查找。udpDnsCacheTTL
:可選。預設120
。 Dns 快取的生存時間(以秒為單位)。onError
:可選。預設(err) => void
。出現錯誤時調用。允許您檢查發送錯誤。customSocket
:可選。預設為null
。客戶端使用的自訂套接字,這是用於模擬的功能,我們不建議在生產中使用它。tags
:可選,預設為null
。如果提供,指標將包括#key1:value1,key2:value2
形式的標籤。 Client.close([cb])
關閉客戶端套接字
cb
:可選。關閉套接字時呼叫的回調函數。如果沒有提供cb
則傳回Promise
。傳回:如果沒有傳遞cb
,則Promise
。
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
回調處理。
Dats 匯出他的模擬,您可以如下使用它:
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`
每個命令標誌也可以在檔案.datsrc
中以 JSON 格式指定,運行時進程將在當前工作目錄中搜尋它,並在運行前合併檔案配置和標誌!
{
"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。
測試是使用指向 HTTP node.js 伺服器的 autocannon 完成的,該伺服器在每個請求時發送計數指標。透過這種測試,我們可以評估函式庫對應用程式效能的影響程度。
以下是最著名的 Node.js statsd 用戶端的基準測試:
圖書館 | 請求/秒(97.5) | 請求/秒(平均) |
---|---|---|
數據 | 45503 | 43174.4 |
熱門人物 | 46975 | 43319.47 |
節點統計資訊 | 14935 | 11632.34 |
統計客戶端 | 42463 | 35790.67 |
根據 | 50271 | 43312.54 |
Base是沒有指標的 HTTP 伺服器。
dats 是由義大利排名第一的房地產公司 Immobiliare.it 的技術部門 ImmobiliareLabs 出色的 Node.js 團隊創建的。
我們目前在我們的產品以及內部工具中使用數據。
如果您在生產中使用數據,請給我們留言。
由 ImmobiliareLabs 和貢獻者使用 ❤️ 製作
我們希望您能為數據做出貢獻!如果您對如何使用資料、錯誤和增強功能有任何疑問,請隨時透過開啟 GitHub 問題與我們聯絡。
dats 根據 MIT 許可證獲得許可。有關詳細信息,請參閱許可證文件。