ไคลเอนต์ Riemann ที่โดดเด่นอย่างเต็มที่สร้างขึ้นจากความน่าเชื่อถือของ Poolboy และพลังที่ยอดเยี่ยมของ Elixir!
Riemannx เป็นไคลเอนต์ Riemann ที่สร้างขึ้นใน Elixir ปัจจุบันเป็นลูกค้ารายเดียวใน Elixir ที่รองรับ UDP และ TLS (รวมถึง TCP) นอกจากนี้ยังมีโหมดแบทช์ที่คุณสามารถใช้งานได้กับการขนส่งใด ๆ
มันมีตัวเลือกรวมการทดลองที่ทำให้ดีที่สุดของทั้ง TCP และ UDP - ในโหมดรวม UDP เป็นวิธีการที่ชื่นชอบ แต่ถ้าขนาดข้อความเกินขนาด UDP Max UDP Set TCP จะถูกใช้
เช่นเคยมีข้อกำหนดเบื้องต้นก่อนที่จะใช้ Riemannx ส่วนใหญ่เหล่านี้ชัดเจน (Elixir, Erlang) แต่มีข้อมูลบางอย่างเกี่ยวกับการทดสอบและสนับสนุนเวอร์ชันใด
รองรับ Erlang ทั้งหมด ~> 18 ได้รับการสนับสนุน ซึ่งรวมถึง 20, 20.1 ยังไม่ได้ทดสอบ แต่ฉันคาดว่าจะไม่มีปัญหาที่ดี
ทดสอบโดยเทรวิส:
18.019.320.0ฉันพยายามที่จะให้แน่ใจว่าเข้ากันได้ตั้งแต่ 1.3.4 เป็นต้นไปและจะดำเนินการต่อไปตามความเหมาะสม ชุดที่ทดสอบแล้ว:
18.0 Elixir: 1.3.4 / 1.4.5 / 1.5.119.3 Elixir: 1.3.4 / 1.4.5 / 1.5.120.0 Elixir: 1.4.5 / 1.5.1บ่อยครั้งที่ไคลเอนต์นั้นไม่มีประโยชน์อย่างมากหากไม่มีเซิร์ฟเวอร์คู่ - สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Riemann เยี่ยมชม http://riemann.io
ลูกค้าได้รับการทดสอบการต่อสู้เมื่อ: 0.2.11 จากเวอร์ชัน 4.0.0 ของไคลเอนต์คุณจะต้องตั้งค่า use_micro เป็นเท็จหากคุณใช้ Riemann รุ่นเก่ากว่า 0.2.13 และไม่ได้ตั้งค่าฟิลด์เวลาด้วยตัวเอง มันควรจะทำงานกับ 0.3.0 แต่ไม่เคยมีการทดสอบอีกครั้ง (ใครก็ตามที่ต้องการทำงานในการทดสอบการรวมฉันจะขอบคุณมาก)
การติดตั้งจะเกิดขึ้นเช่นเดียวกับไลบรารีน้ำอมฤตอื่น ๆ เพิ่มลงในไฟล์มิกซ์ของคุณและส่วนที่เหลือคือประวัติ:
def deps do
[ { :riemannx , "~> 4.0" } ]
endตรวจสอบให้แน่ใจว่าคุณเพิ่ม riemannx ลงในรายการแอปพลิเคชันในไฟล์ mix.exs ของคุณด้วยสิ่งนี้ทำให้มั่นใจได้ว่ามันจะเริ่มต้นด้วยแอปของคุณและจะรวมอยู่ในรุ่นของคุณ (ถ้าคุณใช้ตัวจัดการรุ่น):
applications : [ :logger , :riemannx ] ในการใช้ Riemannx สิ่งที่คุณต้องทำคือกรอกรายการกำหนดค่าบางส่วน - หลังจากนั้นทุกอย่างก็เกิดขึ้นโดยอัตโนมัติ (บันทึกสำหรับการส่งจริงแน่นอน) ด้านล่างนี้เป็นรายการที่ครอบคลุมของตัวเลือกที่มีอยู่:
config :riemannx , [
host: "localhost" , # The riemann server
event_host: "my_app" , # You can override the host name sent to riemann if you want (see: Host Injection)
send_timeout: 30_000 , # Synchronous send timeout
checkout_timeout: 30_000 , # Timeout for checking out a poolboy worker
type: :batch , # The type of connection you want to run (:tcp, :udp, :tls, :combined, :batch)
settings_module: Riemannx.Settings.Default # The backend used for reading settings back
metrics_module: Riemannx . Metrics.Default # The backend used for sending metrics
use_micro: true # Set to false if you use a riemann version before 0.2.13
batch_settings: [
type : :combined # The underlying connection to use when using batching.
size: 50 , # The size of batches to send to riemann.
interval: { 1 , :seconds } , # The interval at which to send batches.
limit: :infinity # The max limit of batches allowed in the batching queue
]
tcp: [
port : 5555 ,
retry_count: 5 , # How many times to re-attempt a TCP connection
retry_interval: 1000 , # Interval to wait before the next TCP connection attempt (milliseconds).
priority: :high , # Priority to give TCP workers.
options: [ ] , # Specify additional options to be passed to gen_tcp (NOTE: [:binary, nodelay: true, packet: 4, active: true] will be added to whatever you type here as they are deemed essential)
pool_size: 5 , # How many TCP workers should be in the pool.
max_overflow: 5 , # Under heavy load how many more TCP workers can be created to meet demand?
strategy: :fifo # The poolboy strategy for retrieving workers from the queue
] ,
udp: [
port: 5555 ,
priority: :high ,
options: [ ] , # Specify additional options to be passed to gen_udp (NOTE: [:binary, sndbuf: max_udp_size()] will be added to whatever you type here as they are deemed essential)
max_size: 16_384 , # Maximum accepted packet size (this is configured in your Riemann server)
pool_size: 5 ,
max_overflow: 5 ,
strategy: :fifo
] ,
tls: [
port: 5554 ,
retry_count: 5 , # How many times to re-attempt a TLS connection
retry_interval: 1000 , # Interval to wait before the next TLS connection attempt (milliseconds).
priority: :high ,
options: [ ] , # Specify additional options to be passed to :ssl (NOTE: [:binary, nodelay: true, packet: 4, active: true] will be added to whatever you type here as they are deemed essential)
pool_size: 5 ,
max_overflow: 5 ,
strategy: :fifo
]
] Riemannx รองรับวิธี send สองวิธีแบบอะซิงโครนัสอื่น ๆ ซิงโครนัส:
การส่งแบบซิงโครนัสช่วยให้คุณสามารถจัดการกับข้อผิดพลาดที่อาจเกิดขึ้นระหว่างการส่งด้านล่างเป็นตัวอย่างที่แสดงทั้งข้อผิดพลาดนี้และเกิดอะไรขึ้นกับการส่งที่ประสบความสำเร็จ:
event = [ service: "riemannx-elixir" ,
metric: 1 ,
attributes: [ a: 1 ] ,
description: "test" ]
case Riemannx . send ( event ) do
:ok ->
"Success!"
[ error: error , msg: encoded_msg ] ->
# The error will always be a string so you can output it as it is.
#
# The encoded message is a binary blob but you can use the riemannx proto
# msg module to decode it if you wish to see it in human readable form.
msg = encoded_msg |> Riemannx.Proto.Msg . decode ( )
Logger . warn ( "Error: #{ error } Message: #{ inspect msg } " )
endการส่งแบบอะซิงโครนัสนั้นเร็วกว่ามาก แต่คุณไม่เคยรู้เลยว่าข้อความของคุณทำมันในหลายกรณีการส่งประเภทนี้ปลอดภัยพอและสำหรับกรณีการใช้งานส่วนใหญ่ตัวเลือกที่แนะนำ มันค่อนข้างง่ายที่จะนำไปใช้:
event = [ service: "riemannx-elixir" ,
metric: 1 ,
attributes: [ a: 1 ] ,
description: "test" ]
Riemannx . send_async ( event )
# Who knows if it made it? Who cares? 60% of the time it works everytime!หมายเหตุ: หากคนงานไม่สามารถส่งได้จะตายและเริ่มต้นใหม่เพื่อให้มีโอกาสกลับไปสู่สถานะ 'ถูกต้อง' ในการส่งแบบอะซิงโครนัสนี้ทำโดยการจับคู่รูปแบบ: ตกลงด้วยคำสั่ง SEND สำหรับการส่งแบบซิงโครนัสหากค่าส่งคืนเป็นข้อผิดพลาดที่เราฆ่าคนงานก่อนที่จะส่งคืนผลลัพธ์
การสนับสนุน TLS ช่วยให้คุณใช้การเชื่อมต่อ TCP ที่ปลอดภัยกับเซิร์ฟเวอร์ Riemann ของคุณเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับวิธีการตั้งค่านี้ดูที่นี่: การรับส่งข้อมูลที่ปลอดภัยของ Riemann โดยใช้ TLS
หากคุณเลือกที่จะใช้ TLS คุณจะใช้การตั้งค่า TCP อย่างหมดจดการรวมกันจะไม่ได้รับการสนับสนุน (และไม่ควรเป็นอย่างใดอย่างหนึ่ง) กับ TLS:
config :riemannx , [
host: "127.0.0.1" ,
type: :tls ,
tls: [
port: 5554 ,
retry_count: 5 , # How many times to re-attempt a TLS connection
retry_interval: 1000 , # Interval to wait before the next TLS connection attempt (milliseconds).
priority: :high ,
# SSL Opts are passed to the underlying ssl erlang interface
# See available options here: http://erlang.org/doc/man/ssl.html
# (NOTE: [:binary, nodelay: true, packet: 4, active: true] will be added to whatever you type here as they are deemed essential)
options: [
keyfile: "path/to/key" ,
certfile: "path/to/cert" ,
verify_peer: true
] ,
pool_size: 5 ,
max_overflow: 5 ,
strategy: :fifo
]
]สมมติว่าคุณได้ตั้งค่าฝั่งเซิร์ฟเวอร์อย่างถูกต้องซึ่งควรเป็นสิ่งที่คุณต้องเริ่มต้น
Riemann มีแนวคิดของดัชนีที่สามารถสอบถามได้ซึ่งช่วยให้คุณสามารถค้นหาเหตุการณ์เฉพาะดัชนีจะต้องสร้างขึ้นเป็นพิเศษในการกำหนดค่าของคุณมิฉะนั้นเซิร์ฟเวอร์จะส่งคืนข้อผิดพลาด "ไม่มีดัชนี"
# Lets send an event that we can then query
Riemannx . send ( [ service: "riemannx" , metric: 5.0 , attributes: [ v: "2.2.0" ] ] )
# Let's fish it out
events = Riemannx . query ( 'service ~= "riemannx"' )
# [%{attributes: %{"v" => "2.2.0"}, description: nil, host: _,
# metric: nil, service: "riemannx", state: nil, tags: [],
# time: _, ttl: _}]สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการสืบค้นและคุณสมบัติภาษาได้ดูแนวคิดหลัก
ส่วนนี้มีบันทึกบางอย่างเกี่ยวกับพฤติกรรมของ Riemannx ที่อาจสนใจคุณหรือตอบคำถามที่คุณมีเกี่ยวกับบางสิ่ง
การแบตช์ ณ 4.0.0 เป็นพฤติกรรมการเชื่อมต่อเริ่มต้น - ขนาดแบทช์เริ่มต้นคือ 50 และช่วงเวลาคือทุก ๆ 1 วินาที การแบทช์ใช้งานได้เช่นนั้น:
สิ่งที่อยู่ในคิวจะถูกส่งทุกช่วงเวลา
หากขนาดของคิวถึงขนาดชุดชุดมันจะถูกล้างโดยไม่คำนึงถึงช่วงเวลา
แบทช์จะลดลงหากไม่มีคนงานเพื่อจัดการแบ checkout_timer :infinity
มีประเภทใหม่ที่เรียกว่า :batch และคีย์การตั้งค่าที่เรียกว่า batch_settings: ภายใน batch_settings คุณสามารถระบุประเภทสำหรับการเชื่อมต่อพื้นฐาน ( :tcp , :udp , :combined , :tls ) รวมกันเป็นค่าเริ่มต้น
สามารถระบุหมายเลขขีด จำกัด ของแบทช์ได้ ( :limit ) หากตั้งค่าเมื่อคิวแบทช์มีจำนวนแบทช์ที่ระบุนั่นคือ limit * batch_size เหตุการณ์ใหม่จะถูกลดลงจนกว่าจะมีการส่งอย่างน้อยหนึ่งชุด ค่าเริ่มต้นคือ :infinity
จากเวอร์ชัน 0.2.13 ของ Riemann มันเป็นไปได้ที่จะตั้งเวลาใน microseconds - Riemannx ตอนนี้รองรับและใช้ฟิลด์ time_micros (เว้นแต่คุณจะตั้งค่าเวลาหรือ time_micros field ด้วยตัวคุณเอง Riemannx จะไม่เขียนทับนั้น) หากคุณใช้ Riemann เวอร์ชันเก่ากว่าจะใช้ฟิลด์วินาทีเท่านั้น
หมายเหตุ: หากคุณตั้งค่าทั้งเวลาและ time_micros Riemann จะจัดลำดับความสำคัญของเวลาไมโครและ riemannx จะเขียนทับ
มันฟังดูดีกว่า แต่โดยทั่วไปจะอธิบายฟังก์ชั่นที่เพิ่มรายการโฮสต์ให้กับกิจกรรมของคุณหากคุณยังไม่ได้ระบุ มี 3 วิธีในการระบุโฮสต์:
ทำก่อนที่คุณจะส่งเหตุการณ์ (เพิ่ม A: คีย์โฮสต์ไปยังรายการคำหลัก)
เพิ่มปุ่ม :event_host ในการกำหนดค่าของคุณ
ให้ riemannx ทำโดยใช้ :inet.gethostname() - เราเรียกว่าเพียงครั้งเดียวและบันทึกผลลัพธ์มันจะไม่ถูกเรียกในทุกเหตุการณ์
ตัวเลือก 2 ตัวสุดท้ายนั้นเป็นที่นิยมมากที่สุดเพราะพวกเขาจะรักษารหัสของคุณให้สะอาด
ในลูกค้ารายนี้มีโอกาสตั้งค่าความสำคัญสำหรับคนงานของคุณที่ช่วยให้คุณให้ความสำคัญสูงขึ้นหรือน้อยลงในการส่งสถิติของคุณไปยัง Riemann
การตั้งค่าความแตกต่างลำดับความสำคัญนั้นขึ้นอยู่กับฮาร์ดแวร์อย่างมากและวิธีที่คุณตั้งค่าลำดับความสำคัญอื่น ๆ โดยทั่วไปข้อมูลเพิ่มเติมสามารถพบได้ที่นี่: http://erlang.org/doc/man/erlang.html#process_flag-2
หากคุณพยายามตั้งค่าลำดับความสำคัญเป็น: Max Riemannx จะเพิ่ม RuntimeERror เพราะนั่นเป็นความคิดที่แย่มาก นอกจากนี้ยังจะเพิ่ม RuntimeError ถ้าคุณลอง: foo เพราะนั่นเป็นความคิดที่แย่มาก
การย้ายไปที่ 3.0 เป็นเพียงกรณีของการเปลี่ยนเลย์เอาต์การกำหนดค่าของคุณ - ตัวเลือกเดียวกันทั้งหมดมีอยู่ยกเว้นตอนนี้คุณสามารถควบคุมคนงานของคุณได้มากขึ้นในระดับประเภทนี้มีค่าโดยเฉพาะอย่างยิ่งเมื่อใช้การตั้งค่ารวมเท่าที่จะทำได้
คุณสามารถดูเลย์เอาต์ใหม่นี้ได้ที่นี่: config
หากมีสิ่งใดที่ไม่สมเหตุสมผลที่นี่อย่าลังเลที่จะเปิดปัญหาเพื่อให้เราสามารถขยาย readme เพื่อแก้ไขความไม่ชัดเจน
หากคุณต้องการจัดเก็บการตั้งค่าของคุณที่อื่นคุณสามารถสร้างแบ็กเอนด์เพื่ออ่านการตั้งค่าจากฐานข้อมูลเช่น ดูโมดูลการตั้งค่าเริ่มต้นสำหรับการโทรกลับที่ต้องการ
สิ่งนี้มีประโยชน์หากคุณต้องการจัดเก็บการตั้งค่าทั่วทั้ง บริษัท ในที่เดียว
อย่าลังเลที่จะเปิดปัญหาหากคุณมีคำถาม
Riemannx รองรับการส่งตัวชี้วัดพื้นฐานคุณสามารถสร้างโมดูลที่กำหนดเองเพื่อรองรับโครงสร้างพื้นฐานใด ๆ (กราไฟท์, การไหลเข้า ฯลฯ ) ปัจจุบันมีการโทรกลับ 3 ครั้ง:
udp_message_sent(size) - แจ้งเมื่อส่งข้อความ UDP และให้ขนาดของข้อความtcp_message_sent(size) - แจ้งเมื่อส่งข้อความ TCP และให้ขนาดของข้อความtls_message_sent(size) - แจ้งเมื่อส่งข้อความ TLS และให้ขนาดของข้อความ ได้รับการบริจาคอย่างอบอุ่นตรวจสอบส่วนโครงการสำหรับแนวคิดบางอย่างที่ฉันได้เขียนลงไปและล่าสุดเกี่ยวกับสิ่งที่กำลังดำเนินการอยู่
พื้นที่เก็บข้อมูลนี้ใช้เวิร์กโฟลว์ Gitflow ซึ่งหมายความว่า PR ทั้งหมดควรชี้ไปที่สาขาพัฒนา! - ด้านล่างนี้เป็นสิ่งที่ควรพิจารณาก่อนที่จะสร้าง PR:
ฉันต้องการรักษาความครอบคลุมการทดสอบที่ 100%! - ฉันอาจปล่อยให้สไลด์นี้ในกรณีเร่งด่วน (ข้อบกพร่อง ฯลฯ )
เพื่อหลีกเลี่ยงความแออัดของเทรวิสโดยไม่จำเป็นจะได้รับการชื่นชมหากคุณตรวจสอบสิ่งต่อไปนี้ในพื้นที่ก่อน:
mix coveralls.html (AIM สำหรับ 100%)mix dialyzer (ใช้เวลาสักครู่และฉันขอขอบคุณที่คุณไม่สามารถทดสอบ Erlang/Elixir ทั้งหมดได้)ฉันพิจารณาคุณสมบัติของไคลเอนต์นี้ให้สมบูรณ์หากการประชาสัมพันธ์ของคุณแบ่งความเข้ากันได้ย้อนหลังอย่างสมบูรณ์หรือเปลี่ยนแปลงพฤติกรรม/ค่าเริ่มต้นที่มีอยู่ก่อนฉันจะขอบคุณหัวและเหตุผลของคุณ :)
ส่วนหนึ่งของรหัสได้รับการยืมมาจากไคลเอนต์ Elixir-Riemann ดั้งเดิม สิ่งที่ protobuf ส่วนใหญ่มาจากที่นั่น