背景
私は普段、New Relic APMを利用してアプリケーションの監視をしています。WEBアプリケーション側についてはAPMを有効にすることですぐに監視することができます。ちょっと工夫した取り組みとしてはAPMのカスタム属性にアカウント情報を付与してアカウント単位でのApex算出などもやったりしました。
一方でバッチ処理などWEBトランザクションから切り離されているものについてはAPMを用いた監視が出来ていませんでした。
バッチ処理のモニタリング方法
New Relic APMの整理の仕方としてバッチ処理などは 非ウェブトランザクション
という名目で取り扱います。非ウェブトランザクションの説明としては以下のとおりです。
非ウェブトランザクションは、ウェブトランザクションではないトランザクションです。当社では、トランザクションがウェブリクエストによって開始したかどうかは検知しません。メッセージの手続きやバックグラウンドタスクなど、ウェブリクエストを扱わないプロセスやジョブも、非ウェブトランザクションに含まれます。
非ウェブトランザクションをnew Relic APMでモニタリングするためにはcustom instrumentationの設定を行う必要があります。各言語ごとにそれぞれやり方があります。私の運用しているサービスはRubyで書かれているので、ここで紹介するのはRubyでの設定方法になります。
以下は公式のサンプルです
SalesOrganization#find_new_leads
がコールされたときに非ウェブトランザクションとしてモニタリングするように設定されています。重要な点としては以下の3点です。
-
ControllerInstrumentation
モジュールをincludeします -
add_transaction_tracer
にてfind_new_leadsをモニタリング対象とします。 -
:category => :task
とすることで非ウェブトランザクションとして指定します
require 'newrelic_rpm'
class SalesOrganization
include
::NewRelic::Agent::Instrumentation::ControllerInstrumentation
def find_new_leads
...
end
add_transaction_tracer :find_new_leads, :category => :task
end
カスタム属性としてアカウント情報を付与
こちらの資料でも紹介しているようにWEBトランザクションのモニタリングについてはアカウント情報を付与して、アカウント単位での分析ができるようにしています。今回のケースも同様にカスタム属性としてアカウント情報を付与するようにしました。
やり方はWEBトランザクションと同様で add_custom_attributes
にアカウント情報を追加することで実現可能です。
require 'newrelic_rpm'
class SalesOrganization
include
::NewRelic::Agent::Instrumentation::ControllerInstrumentation
def find_new_leads
...
attributes = {
user_id: job.job_definition.user.id,
account_id: job.job_definition.user.account.id,
}
::NewRelic::Agent.add_custom_attributes(attributes)
...
end
add_transaction_tracer :find_new_leads, :category => :task
end
New Relic APM側から確認
New Relic APMのダッシュボードから APM > Transactions
と遷移し、Typeを「Non-Web」に設定することで非ウェブトランザクションがモニタリング出来ていることを確認できます。
また、カスタム属性として追加したアカウント情報もこちらより確認が出来ます。
現在はバッチ処理においてもWEBトランザクション同様に、アカウント単位で分析するようにダッシュボードに追加しております。
まとめ
今回はNew Relic APMを用いたバッチ処理のモニタリング方法をまとめました。以上!!!