1

我想计算从不同程序实例(节点)发送的消息数量。这些节点是动态出现的。消息格式如下:

node01 - I feel like I'm loosing the grip.
node02 - I'm sad.
node02 - I'm loosing the reason to live.

我打算在 Logstash(带metrics过滤器)中解析日志和统计统计信息,然后将它们发送到 Ganglia 进行显示。但是,gangliaLogstash 中对输出的每次调用只允许发送一个统计信息(而不是像 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数组转换为可拆分的东西。我想我可以gsubmutate过滤器中使用,但我不确定如何在数组上使用它以及如何从中获取节点名称。

更新

我检查了包含的解决方案,它也不起作用,我认为 Logstash 只使用一种类型的输出。我将不得不克隆我的输出并单独标记它们以使其工作(不确定这是否可能)。无论如何,这不是理想的解决方案,我只想更好地展示我想要实现的目标。

4

0 回答 0