Fluentd plugin to measure elapsed time to process messages
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
benchmark
example
lib/fluent/plugin
spec
.gitignore
.rspec
.travis.yml
CHANGELOG.md
Gemfile
Gemfile.fluentd.v10
LICENSE
README.md
Rakefile
fluent-plugin-measure_time.gemspec

README.md

fluent-plugin-measure_time

Build Status Code Climate

Fluentd plugin to measure elapsed time to process messages

Installation

Use RubyGems:

gem install fluent-plugin-measure_time

Parameters

  • tag

    The output tag name. Default is measure_time

  • hook (required)

    Specify the method to measure time.

  • interval

    The time interval to emit measurement results. Default is nil which do not compute statistics and emit the time in each measurement.

Configuration Example 1 - Profile an Output Plugin

As an example, let's profile how long the emit method of fluent-plugin-grep is taking. Configure fluentd.conf as below:

For Fluentd v0.10:

<source>
  type measure_time
  # This makes available the `measure_time` directive for all plugins
</source>

<source>
  type forward
  port 24224
</source>

# measure_time plugin output comes here
<match measure_time>
  type stdout
</match>

# Whatever you want to do
<match greped.**>
  type stdout
</match>

<match **>
  type grep
  add_tag_prefix greped
  <measure_time>
    tag measure_time
    hook emit
  </measure_time>
</match>

For Fluentd v0.12:

<label @measure_time>
  <match>
    @type measure_time
    # This makes available the `measure_time` directive for all plugins
  </match>
</label>

<source>
  @type dummy
  tag raw.dummy
  dummy {"message":"foo"}
</source>

# measure_time plugin output comes here
<match measure_time>
  @type stdout
</match>

# Whatever you want to do
<match greped.**>
  @type stdout
</match>

<match **>
  @type grep
  add_tag_prefix greped
  <measure_time>
    tag measure_time
    hook emit
  </measure_time>
</match>

The output of fluent-plugin-measure_time will be as below:

measure_time: {"time":0.000849735,"class":"Fluent::GrepOutput","hook":"emit","object_id":83935080}

where time denotes the measured elapsed time, and class, hook, and object_id denotes the hooked class, the hooked method, and the object id of the plugin instance.

interval option

fluent-plugin-measure_time outputs the elapsed time for each calling, but you can use the interval option when you want to get statistics in each interval.

measure_time: {"max":1.011,"avg":0.002","num":10,"class":"Fluent::GrepOutput","hook":"emit","object_id":83935080}

where max and avg are the maximum and average elapsed times, and num is the number of being called in each interval.

Configuration Example (2) - Profile the in_forward plugin

I introduce an interesting example here.

Following illustration draws the sequence of that in_forward plugin receives a data, processes, and passes the data to output plugins.

Sequence Diagram

     +–––––––––––––+    +––––––––––––––+   +––––––––––––––+
     |  in_forwrd  |    |   Output     |   |   Output     |
     +––––––+––––––+    +––––––+–––––––+   +––––––+–––––––+
#on_message | start = Time.now |                  |
            +––––––––––––––––––>                  |
            |      #emit       |                  |
            |                  +––––––––––––––––––>
            |                  |      #emit       |
            |                  |                  |
            |                  |                  |
            |                  <– – – – – – – – – +
            | elapsed = Time.now - start          |
            <– – – – – - – – – +                  |
            |                  |                  |
            +                  +                  +

As the illustration, by hooking on_message method of in_forward plugin, we can measure the blocking time taking to process the received data, which also means that the time taking until in_forward will be ready for receiving a next data.

This profiling is very useful to investigate when you have a suspicion that throughputs of Fluentd fell down extremely.

The configuration will be as follows:

For Fluentd v0.10:

<source>
  type measure_time
  # This makes available the `measure_time` directive for all plugins
</source>

<source>
  type forward
  port 24224
  <measure_time>
    tag measure_time
    hook on_message
  </measure_time>
</source>

<match measure_time>
  type stdout
</match>

# whatever you want
<match **>
  type stdout
</match>

For Fluentd v0.12:

<label @measure_time>
  <match>
    @type measure_time
    # This makes available the `measure_time` directive for all plugins
  </match>
</match>

<source>
  @type forward
  port 24224
  <measure_time>
    tag measure_time
    hook on_message
  </measure_time>
</source>

<match measure_time>
  @type stdout
</match>

# whatever you want
<match **>
  @type stdout
</match>

Output becomes as below:

measure_time: {"time":0.000849735,"class":"Fluent::ForwardInput","hook":"on_message","object_id":83935080}

ChangeLog

See CHANGELOG.md for details.

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

Copyright

Copyright (c) 2014 Naotoshi Seo. See LICENSE for details.