Ruby
fluentd

FluentdのOutputPluginから間隔空けて行儀よくWebのAPIを叩きたい

More than 3 years have passed since last update.

emitではQueueにpushするだけにして、別スレッドでQueueからpopする形をとれば、行儀よく間隔を空けながらWebのAPIを叩けると考えた次第。

他にはどんな解があるだろう。

サンプルコード

    def configure(conf)
      super
      @q = Queue.new
    end

    def start
      super
      @thread = Thread.new(&method(:post))
    end

    def shutdown
      super
      Thread.kill(@thread)
    end

    def emit(tag, es, chain)
      es.each {|time, record|
        param = OpenStruct.new
        param.tag = tag
        param.time = time
        param.record = record

        @q.push param
      }

      chain.next
    end

    private

    def post
      loop do
        param = @q.pop
        tag = param.tag
        time = param.time
        record = param.record

        #WebのAPIを叩く
        HTTParty.post(@web_api_url, :body => "#{tag},#{param},#{time},#{record}")
        sleep(1)
      end

利用例

https://github.com/bash0C7/fluent-plugin-idobata/blob/d35eeed4e5a7390e4fa0044aa3b9512a4eff37bd/lib/fluent/plugin/out_idobata.rb#L55

このやり方について

Inputプラグインでこのようなやり方をよく見ます。
上記の例は固定値でsleep(1)としましたが、実際にはpost_intervalとかの名前でconfigで間隔を指定できるといいでしょう。