Poolboy의 신뢰성과 Elixir의 멋진 힘을 기반으로 한 완전히 특징 지어진 Riemann 클라이언트!
Riemannx는 Elixir에 내장 된 Riemann 클라이언트이며 현재 UDP 및 TLS (및 TCP)를 지원하는 Elixir의 유일한 클라이언트입니다. 전송품과 함께 작동하는 배치 모드도 있습니다.
TCP와 UDP 모두를 최대한 활용하는 실험적 결합 옵션이 있습니다. 결합 모드 UDP는 선호하는 접근 방식이지만 메시지 크기가 최대 UDP 크기 세트를 초과하면 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://iemann.io를 방문하십시오.
고객은 0.2.11 에서만 전투 테스트를 받았습니다. 클라이언트의 버전 4.0.0에서 0.2.13 이상의 Riemann 버전을 사용하고 시간 필드를 직접 설정하지 않으면 use_micro false로 설정해야합니다. 0.3.0 과 함께 작동해야하지만 다시는 테스트되지 않았습니다 (통합 테스트 작업을 원하는 사람은 누구나 감사합니다).
설치는 다른 Elixir 라이브러리와 마찬가지로 이루어지며 믹스 파일에 추가하면 나머지는 역사입니다.
def deps do
[ { :riemannx , "~> 4.0" } ]
endMix.exs 파일의 응용 프로그램 목록에 Riemannx를 추가하십시오. 이렇게하면 앱으로 시작하여 릴리스에 포함되도록하십시오 (릴리스 관리자를 사용하는 경우).
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 메소드를 지원합니다. 하나는 다른 하나는 동기식입니다.
동기식 보내기는 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 지원은 Riemann 서버와의 안전한 TCP 연결을 사용하여이를 설정하는 방법에 대한 자세한 내용을 확인할 수 있습니다.
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 같습니다
Riemann의 버전 0.2.13 에서 마이크로 초에서 시간을 설정할 수있었습니다. Riemannx는 이제 time_micros 필드를 지원하고 사용합니다 (시간 또는 time_micros 필드를 직접 설정하지 않는 한 Riemannx는이를 덮어 쓰지 않습니다). 이전 버전의 Riemann을 사용하는 경우 초 필드 만 사용합니다.
참고 : Time과 Time_micros Riemann을 모두 설정하면 Micro Time을 우선시하고 Riemannx는 두 가지를 덮어 쓰지 않습니다.
그것은 그것보다 더 멋진 것처럼 들리지만 기본적으로 이벤트를 지정하지 않은 경우 호스트 항목을 추가하는 기능을 설명합니다. 호스트를 지정하는 3 가지 방법이 있습니다.
이벤트를 보내기 전에 수행하십시오 (키워드 목록에 호스트 키 추가)
구성에 :event_host 키를 추가하십시오.
Riemannx가 다음을 사용하여 다음을 수행하십시오 :inet.gethostname() - 한 번만 호출하고 결과를 저장하면 모든 이벤트에서 호출되는 것은 아닙니다.
마지막 두 가지 옵션은 코드를 깨끗하게 유지하기 때문에 가장 유리합니다.
이 고객에게는 근로자에게 우선 순위를 설정하여 통계 발송에 Riemann으로 우선 순위가 높거나 적을 수 있습니다.
차이 설정 우선 순위는 하드웨어와 다른 우선 순위를 일반적으로 설정 한 방법에 크게 달려 있습니다. 추가 정보는 http://erlang.org/doc/man/erlang.html#process_flag-2를 참조하십시오.
Max Riemannx는 끔찍한 아이디어이기 때문에 우선 순위를 설정하려고한다면 : Max Riemannx는 RuntimeError를 높입니다. 시도하면 런타임 에러가 발생합니다. Foo는 끔찍한 아이디어이기 때문입니다.
3.0으로 마이그레이션하는 것은 본질적으로 구성 레이아웃을 변경하는 경우 일뿐입니다. 이제 동일한 옵션이 모두 존재하는 것을 제외하고는 이제 유형 수준에서 작업자를 더 많이 제어 할 수 있습니다. 이는 TCP 작업자의 작은 풀과 더 큰 UDP 작업자 풀이 이전과 마찬가지로 더 큰 UDP 작업자 풀을 사용할 때 특히 가치가 있습니다 (2x _size).
이 새로운 레이아웃을 여기에서 볼 수 있습니다 : 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 (100%를 목표로)mix dialyzer (시간이 걸리고 모든 Erlang/Elixir 버전을 테스트 할 수는 없습니다)이 클라이언트 기능이 완료되거나 PR이 역 호환성을 완전히 돌리거나 기존 동작/기본값을 변경하면 헤드 업과 정당화에 감사드립니다 :).
원래 Elixir-Riemann 클라이언트에서 코드의 일부가 빌려 왔습니다. Protobuf 물건의 대부분은 거기에서 나옵니다.