我想计算从不同程序实例(节点)发送的消息数量。这些节点是动态出现的。消息格式如下:
node01 - I feel like I'm loosing the grip.
node02 - I'm sad.
node02 - I'm loosing the reason to live.
我打算在 Logstash(带metrics
过滤器)中解析日志和统计统计信息,然后将它们发送到 Ganglia 进行显示。但是,ganglia
Logstash 中对输出的每次调用只允许发送一个统计信息(而不是像 Graphite 输出中那样的数组)。我只知道如何通过节点名称的硬编码来实现我的 Logstash 配置:
input { stdin { } }
filter
{
grok { match => [ "message", "%{WORD:instance} - %{GREEDYDATA:data}" ] }
metrics
{
meter => "events.%{instance}"
add_tag => "metric"
flush_interval => 1
}
}
output
{
if "metric" in [tags]
{
ganglia
{
group => "node01"
host => "239.2.11.71"
metric => "events"
metric_type => "uint32"
value => "%{events.node01.rate_1m}"
}
ganglia
{
group => "node02"
host => "239.2.11.71"
metric => "events"
metric_type => "uint32"
value => "%{events.node02.rate_1m}"
}
stdout { codec => rubydebug { } }
}
}
也许您可以建议我如何创建与节点名称无关的配置?我想过在过滤器中循环遍历events
数组ruby
(它允许您编写任意代码),并创建新事件,但我不知道如何从代码中创建新事件。
我也想过使用 拆分事件multiline
,但我不知道如何将events
数组转换为可拆分的东西。我想我可以gsub
在mutate
过滤器中使用,但我不确定如何在数组上使用它以及如何从中获取节点名称。
更新
我检查了包含的解决方案,它也不起作用,我认为 Logstash 只使用一种类型的输出。我将不得不克隆我的输出并单独标记它们以使其工作(不确定这是否可能)。无论如何,这不是理想的解决方案,我只想更好地展示我想要实现的目标。