Posts categorized "Fluentd" Feed

Feb 09, 2014
Mar 14, 2013

この前つくった fluent-plugin-ganglia を gem にしてバージョン 0.0.1 をリリースした。

前回のエントリーで書いた時点では、gmond を multicast かつ upd_send_channel を bind_hostname = "yes" として動かしている場合に実はうまくいっていなかった。うごいた!とおもってあのエントリーをよろこびいさんで書いた時点では、1台のホストでしかどうささせていなくて、同じ metric group にはいる他のホストで動かし始めたら全然グラフでてこない、という始末...。

これは gmetric gem の Ganglia::GMetric#send が、

conn = UDPSocket.new
conn.connect(host, port)

conn.send gmetric[0], 0
conn.send gmetric[1], 0
conn.close

こうなってて bind してないからだったようで、Ganglia::GMetric#send は使わずにプラグイン内で、

conn = UDPSocket.new
conn.bind(HOSTADDR, 0) if @bind_hostname
conn.send gmetric[0], 0, @host, @port
conn.send gmetric[1], 0, @host, @port
conn.close

こんなような感じで IPSocket.getaddress(Socket.gethostname) でとってきた IP (HOSTADDR定数のところ) に bind して送るようにしたらうまく行った。まぁ、つまり bind_hostname = "yes" なんで bind しろよ、ということと思われる。gmetric コマンドを strace してみてても bind してたし(というか strace して差分みてて気づいた)。

この multicast + bind_hostname してる環境で metric 送りつけるには、こういう設定。

<match metrics>
  type          ganglia
  host          239.2.11.71
  port          8649
  group         metric_group
  name_keys     metrics.field1,metrics.field2
  bind_hostname true
</match>

bind_hostname true で bind してから送るようになる。multicast だけど bind_hostname してなければいらない。

というのを経ての 0.0.1 はコレの本番環境で絶賛稼働中。unicast での Ganglia はためしたことがないのだけどたぶんうごくとおもうので、もし試せる方おりましたらフィードバックいただけると幸い...。

ご利用ください。

Feb 19, 2013

td-agent と fluent-gem コマンドでインストールした fluentd plugins、gem を管理するための Puppet モジュールつくってみた。

package provider に "fluentgem" が追加されているので、

include td-agent
package { 'fluent-plugin-datacounter':
  ensure   => 'installed',
  provider => 'fluentgem',
  require  => Package['td-agent'],
}

として、fluent plugin な gem などを追加することができるので、全部 /etc/td-agent/plugin にいれるとか、exec でほげほげしてふがふがして とか面倒なことしなくてもよくなった。あとは、最小限の td-agent.conf がはいっているのみ。

これで、 td-agent をばらまけるようになったし、先週書いた ganglia plugin で metric 収集も万全。ようやく fluentd スタート地点。

Feb 15, 2013

fluentd を使い始めて2日目。結局 ganglia に metric 送れないことには....、ということで plugin 書いてみた。

仕組み的には @sfujiwara さんの zabbix のやつとおんなじやろ、と思い https://github.com/fujiwara/fluent-plugin-zabbix からコピペしていくつかもにょもにょしただけ (・∀・)

LTSV なアクセスログをみて datacounter でステータスコード別に集計して ganglia に metric おくる、というのをやってみた。

<source>
  type tail_labeled_tsv
  path /var/log/users_access_log
  tag web.access
  pos_file /tmp/td-agent/users_access_log.pos
</source>

<match users.access>
  type copy

  <store>
    type datacounter
    tag web.access.status_count
    count_interval 60s 
    count_key status
    pattern1 2xx ^2\d\d$
    pattern2 3xx ^3\d\d$
    pattern3 4xx ^4\d\d$
    pattern4 5xx ^5\d\d$
  </store>
</match>

<match users.access.status_count>
  type copy
  <store>
    type stdout
  </store>
  <store>
    type             ganglia
    gmond_port       8701
    name_key_pattern [2345]xx_count
    value_type       uint32
    units            views/min 
    group            users_access
    spoof            192..0.2.100:web01
    dmax             30
  </store>
</match>

設定値は gmetric コマンドのロングオプション名とほぼ同じ。fluentd とかぶる名前が幾つかあるので

  • port = gmond_port
  • type = value_type

となっている。

ganglia に metric おくるのには gmetric というそのまんまの名前の gem があったのでそれを使ってぺっと送る。が、td-agent で使っている ruby 1.9.3 に対応していないのか以下のようなエラーがでる...。

2013-02-15 18:38:59 +0900: fluent/engine.rb:115:rescue in emit_stream: emit transaction failed  error="undefined method `reactor_running?' for EventMachine:Module"

とりあえず以下パッチをあてたらうごいた。

--- gmetric.rb.org  2013-02-15 18:41:17.000000000 +0900
+++ gmetric.rb        2013-02-15 18:41:05.000000000 +0900
@@ -1,5 +1,6 @@
 require "stringio"
 require "socket"
+require "eventmachine"

 module Ganglia
   class GMetric

が、こんなことでよいのか ruby 的なところがわからない...。問題なのはここの if 文。

  if defined?(EventMachine) and EventMachine.reactor_running?        # open an ephemereal UDP socket since
    # we do not plan on recieving any data
    conn = EM.open_datagram_socket('', 0)

    conn.send_datagram gmetric[0], host, port
    conn.send_datagram gmetric[1], host, port
    conn.close_connection_after_writing
  else
    conn = UDPSocket.new
    conn.connect(host, port)

    conn.send gmetric[0], 0
    conn.send gmetric[1], 0
    conn.close
  end

だれかなおしてー (´・ω・`)

とりあえず、ganglia にいろいろ送れるようになったけど、設定的になんかいろいろもうすこし良いデフォルトがあるかなぁ(spoof のあたりとか title とか)と思うのでもう少しいじって安定したら gem 化などやってみる。

fluentd++