ไคลเอ็นต์ statsd UDP/TCP ที่พึ่งพาศูนย์แบบเรียบง่ายสำหรับ Node.js
มีหลายครั้งที่คุณต้องรวบรวมตัวชี้วัดและต้องการบางสิ่งที่เรียบง่ายโดยไม่ต้องเขียนแบบสำเร็จรูปมากเกินไป dats
ช่วยคุณได้!
ไคลเอนต์รายนี้ตั้งเป้าที่จะมี 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)
สามารถรับพัสดุได้เวลา 13.00 น.
คุณสามารถติดตั้งด้วย 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
ไคลเอนต์ statsd
new Client(options)
options
: วัตถุการกำหนดค่าhost
: statsd โฮสต์ ( 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 สำหรับ udpudpDnsCacheTTL
: ไม่จำเป็น ค่าเริ่มต้น 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
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`
แฟล็กคำสั่งทุกรายการสามารถระบุในรูปแบบ 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
คุณสามารถดูการเปรียบเทียบอัตโนมัติสำหรับทุกคอมมิตได้ที่ลิงก์ต่อไปนี้: ถัดไปและหลัก
การทดสอบเสร็จสิ้นโดยใช้ autocannon ชี้ไปที่เซิร์ฟเวอร์ HTTP node.js ที่ส่งเมตริกการนับในแต่ละคำขอ ด้วยการทดสอบประเภทนี้ เราจะประเมินว่าไลบรารีมีอิทธิพลต่อประสิทธิภาพของแอปพลิเคชันมากน้อยเพียงใด
ด้านล่างนี้เป็นรายงานการวัดประสิทธิภาพกับไคลเอนต์ statsd ของ node.js ที่มีชื่อเสียงที่สุด:
ห้องสมุด | ความต้องการ/วินาที (97.5) | ความต้องการ/วินาที (เฉลี่ย) |
---|---|---|
ข้อมูล | 45503 | 43174.4 |
ช็อตเด็ด | 46975 | 43319.47 |
โหนด statsd | 14935 | 11632.34 |
statsd-ไคลเอนต์ | 42463 | 35790.67 |
ฐาน | 50271 | 43312.54 |
Base คือเซิร์ฟเวอร์ HTTP ที่ไม่มีหน่วยวัด
das ถูกสร้างขึ้นโดยทีมงาน Node.js ที่น่าทึ่งที่ ImmobiliareLabs แผนกเทคโนโลยีของ Immobiliare.it บริษัทอสังหาริมทรัพย์อันดับ 1 ในอิตาลี
ขณะนี้เรากำลังใช้ข้อมูลในผลิตภัณฑ์ของเรารวมถึงเครื่องมือภายในของเรา
หากคุณกำลังใช้ dats ในการผลิตโปรดส่งข้อความถึงเรา
ทำด้วย❤️โดย ImmobiliareLabs & Contributors
เราอยากให้คุณมีส่วนร่วมใน dats! หากคุณมีคำถามใดๆ เกี่ยวกับวิธีใช้ข้อมูล จุดบกพร่อง และการเพิ่มประสิทธิภาพ โปรดติดต่อได้โดยเปิดประเด็น GitHub
das ได้รับอนุญาตภายใต้ใบอนุญาต MIT ดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม