はじめに!
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 あたりにそういう設定書けるのが美しいんですが、そういうのはドキュメント読んでてもどうも見つからなんですよね。 つらい。