月曜日までに考えておきます

ITネタとゲームネタ中心に興味のあること色々書きます。

NewRelicにWorkerの速度を監視されてつらかったのを解消したけどコレジャナイ感

はじめに!

NewRelic便利ですよね、しかもAWS使ってると無料の範囲でもかなり便利に使えるのでまさに、「感謝っ・・・・!圧倒的感謝っ・・・・!」です。

それを踏まえた上で。

NewRelicがWorkerの処理を監視しやがるんですよ。

「うわっ、お前のWorker遅すぎ・・・」

みたいな感じで12sec(msecではない!)を最も遅いのに出してくるんですが。

知ってる!!

遅いからWorkerにしてんだよ。リアルタイムにやるわけねーだろ、なのにこれが遅いリクエストとして上に上がってくるのまじつらい。車なんて買う金ないから買ってないのに若者のクルマ離れとか言われるぐらいの理不尽感ですよ。

というわけで、まあこれは gitignore 的に生まれる前に消し去るべきですよね。

NewRelic ignore でググるわけですよ。

そしてヒットするのがこれ。

Ignoring specific transactions | New Relic Documentation

  • Ignoring specific actions with Rails

のところを読むんですが、むっちゃ Rails の controller or Sinatra 的な話で、worker の話ではないのですね。worker のコードにこれを入れてみてもエラーが出ちゃいました。

発想を変えて、 NewRelic で Sidekiq の処理を ignore したいわけなので、 "NewRelic Sidekiq" とかで検索して見るわけですね。 そしてこういうドキュメントがヒットするわけなんですが、 Sidekiq instrumentation | New Relic Documentation とくに、Sidekiqのリクエストを ignore する方法については書かれてないのですね。

うまく行ったけどコレジャナイ

そこで、もう一度 Ignoring specific transactions に戻ってみると、"Ignoring transactions dynamically" があり、NewRelic::Agent.ignore_transaction などをコールすると ignore できるようなことが書いてます。

なので求められているとおりにこんなコードを書いて見ると・・・

class MyWorker
  include Sidekiq::Worker
  include Sidetiq::Schedulable
  sidekiq_options queue: :my_worker, retry: false


  recurrence { hourly.minute_of_hour(10, 20, 30, 40, 50, 0) }

  def perform
    NewRelic::Agent.ignore_transaction
    MyModel.do_long_time_job
  rescue => ex
    ExceptionNotifier.notify_exception(ex)
  end
end

おおお、NewRelicから消えますね。 でも

def perform
  NewRelic::Agent.ignore_transaction
  # 処理
end

とか、突然メインのメソッド内で監視ツールから除外する、みたいなコードになるのってすごく気持ち悪いんでコレジャナイ感すごいんですが。 newrelic.yml あたりにそういう設定書けるのが美しいんですが、そういうのはドキュメント読んでてもどうも見つからなんですよね。 つらい。