プログラムのさまざまなインスタンス (ノード) から送信されたメッセージの数を数えたいと考えています。これらのノードは動的に表示されます。メッセージ形式は次のようになります。
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 で出力を呼び出すたびに、1 つの統計しか送信できません (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 は 1 つのタイプの 1 つの出力しか使用しないと思います。出力を複製し、それらを個別にタグ付けして機能させる必要があります(これが可能かどうかはわかりません)。とにかく、それは望ましい解決策ではありません。達成しようとしていることをより良く提示したかっただけです。