建立在Poolboy的可靠性和Extrixir的强大力量之上的完整的Riemann客户端!
riemannx是建立长生不老药的Riemann客户端,目前是Elixir中唯一支持UDP和TLS(以及TCP)的客户。您还可以使用一个批处理模式,可与任何传输一起使用。
它具有实验合并的选项,可以使TCP和UDP最好 - 在组合模式下,UDP是最喜欢的方法,但是如果消息大小超过最大UDP大小,则将使用TCP。
与往常一样,在使用riemannx之前,需要有先决条件,其中大多数是显而易见的(Elixir,Erlang),但包含一些有关对哪些版本进行测试和支持的信息。
目前,所有Erlang版本〜> 18均得到支持。这包括20、20.1尚未测试,但我预见到那里没有很大的问题。
由Travis测试:
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版本中,如果您使用超过0.2.13的Riemann版本,并且自己不是自己设置时间字段,则需要将use_micro设置为false。它应该与0.3.0一起使用,但以前尚未经过测试(任何想在集成测试上工作的人都会非常感谢它)。
安装就像其他任何Elixir库一样,将其添加到您的混合文件中,其余的就是历史记录:
def deps do
[ { :riemannx , "~> 4.0" } ]
end确保将Riemannx添加到Mix.exs文件中的应用程序列表中,这还确保它可以从您的应用程序开始,并且它将包含在您的版本中(如果您使用Release Manager):
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!注意:如果工人无法发送它,将会死并重新开始,从而有机会返回“正确”状态。在异步发送时,通过模式匹配来完成此操作:确定发送命令,对于同步发送,如果返回值是错误,则我们在返回结果之前杀死了该工人。
TLS支持使您可以使用Riemann Server使用安全的TCP连接,以了解有关如何设置此设置的更多信息:使用TLS安全Riemann流量
如果您选择使用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 ,:compined, :tls )。一如既往的组合是默认值。
可选地,可以指定批处理限制号( :limit )。如果设置,一旦批处理队列具有指定数量的批次,那就是limit * batch_size事件,将删除新事件,直到发送至少一批。默认值是:infinity
从Riemann的0.2.13版本中,可以在微秒中设置时间-Riemannx现在支持并使用time_micros字段(除非您自己设置了时间或time_micros字段,否则riemannx不会覆盖该字段)。如果您使用的是旧版本的Riemann,则只会使用秒字段。
注意:如果您设置了Time和Time_micros Riemann,则将优先考虑微型时间,而Riemannx也不会覆盖。
听起来比它更奇特,但基本上描述了如果您没有指定的功能,将主机条目添加到事件中。有3种指定主机的方法:
在发送事件之前执行此操作(将:主机密钥添加到关键字列表)
将:event_host键添加到您的配置。
让riemannx使用:inet.gethostname()进行操作 - 我们只调用一次并保存结果,并非在每个事件中调用。
最后两个选项最有利,因为它们可以保持您的代码清洁。
在这个客户中,有机会为您的工人设定优先级,使您可以将统计数据发送到Riemann时更高或更少的优先级。
优先级设置的区别在很大程度上取决于硬件以及您如何设置其他优先级,可以在此处找到更多信息:http://erlang.org/doc/man/erlang.html#process_flag-2
如果您试图将优先级设置为:Max Riemannx将提出一个RuntimeRoror,因为这是一个可怕的主意。如果您尝试的话,它也会提高运行时间:因为这也是一个可怕的主意。
迁移到3.0本质上只是更改配置布局的一种情况 - 所有相同的选项都存在,但现在您可以在类型级别上对工人进行更多的控制权,当您尽可能地使用组合的设置时,这尤其有价值,例如,TCP工人和较大的UDP Worker池量较小,而不是较大的UDP Worker Pool,而不是2x的pool_size_size_size_size_size_size_size_size you)。
您可以在这里看到此新布局:配置
如果有任何东西没有意义,这里可以随意打开一个问题,以便我们可以扩展读书文件以修复不持久性。
如果要将设置存储在其他地方,则可以创建一个后端以从数据库中读取设置。查看所需回调的默认设置模块。
如果您想将公司范围的设置存储在一个地方,这将很有用。
如果您有疑问,请随时打开问题。
riemannx支持发送基本指标,您可以创建一个自定义模块来支持任何基础架构(石墨,涌入等)。目前有3个回调:
udp_message_sent(size) - 通知何时发送UDP消息并给出消息的大小。tcp_message_sent(size) - 通知何时发送TCP消息并给出消息的大小。tls_message_sent(size) - 通知何时发送TLS消息并给出消息的大小。 捐款得到热烈接收,请查看“项目”部分,以获取我写下的一些想法,以及有关正在进行的内容的最新想法。
该存储库使用gitflow工作流,这意味着所有公关都应指向开发分支! 。以下是创建PR之前需要考虑的一些事情:
我想维持100%的测试覆盖范围! - 我可能会在紧急情况(错误等)中滑动。
为了避免不必要的Travis拥塞,如果您首先在本地检查以下情况:
mix coveralls.html (目标100%)mix dialyzer (需要一段时间,我感谢您无法测试所有Erlang/Elixir版本)我认为此客户端功能完成,如果您的PR完全向后兼容或更改预先存在的行为/默认情况,我会很喜欢抬头和您的理由:)。
一部分代码已从原始的Elixir-Riemann客户端借用。大多数Protobuf东西都来自那里。